前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL常用存储引擎之InnoDB

MySQL常用存储引擎之InnoDB

作者头像
Yuou
发布2022-09-26 15:41:25
3200
发布2022-09-26 15:41:25
举报

MySQL5.5以后版本的默认存储引擎

  • 支持事物的ACID特性
  • Innodb使用表空间存储
    • innodb_file_per_table (如果此参数为ON)
      • 则会创建一个独立的表空间:tablename.ibd
      • 系统表空间:ibdataX(如果参数为OFF) X表示一个数字

演示参数ON

代码语言:javascript
复制
mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)
由此可见 file_per_table是开启的,可以为每一个表创造一个表空间
mysql> create table myinnodb(id int,c1 varchar(40)); # 新建一个表
找的你的数据库下面可以看到
myinnodb.ibd myinnodb.frm

演示参数OFF

代码语言:javascript
复制
mysql> set global innodb_file_per_table=OFF;
mysql> show variables like "innodb_file_per_table";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | OFF   |
+-----------------------+-------+
1 row in set (0.00 sec)
mysql> create table myinnodb1(id int,cid varchar(20))engine=innodb;
查看数据库目录下只有
 myinnodb1.frm  # 存储的系统表空间

1.0 系统表空间和独立表空间怎么选

比较

  • 系统表空间无法简单的收缩文件大小
  • 独立表空间可以通过optimize table命令收缩文件大小
  • 系统表空间会产生IO瓶颈
  • 独立表空间可以同时向多个文件刷新数据

建议对Innodb使用独立表空间

1.1 如何把原来存在于系统表空间的表转移到独立表空间

步骤

  1. 使用mysqldump导出所有数据库表数据
  2. 停止mysql服务,修改参数,并删除innodb相关文件
  3. 重启mysql服务,重建innodb系统表空间
  4. 重新导入数据

注意: Innodb数据字典信息,这种信息还是很重要的

1.3 Innodb存储引擎的特性

  • Innodb是一种事务性存储引擎
  • 完全支持事物的ACID特性
  • Redo logUndo log

查看Redo log大小 以字节为单位 redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。

代码语言:javascript
复制
mysql> show variables like "innodb_log_buffer_size";
+------------------------+----------+
| Variable_name          | Value    |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
1 row in set (0.00 sec)
cd /var/lib/mysql/
查看到这个目录下会有两个文件
ib_logfile0 和 ib_logfile1
这是因为默认的redo log的files是2
mysql> show variables like 'innodb_log_files_in_group';
+---------------------------+-------+
| Variable_name             |Value |
+---------------------------+-------+
| innodb_log_files_in_group | 2     |
+---------------------------+-------+
1 row in set (0.00 sec)

Undo log用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。 包括MVCC

  • Innodb支持行级锁
  • 行级锁可以最大程度的支持并发
  • 行级锁由存储引擎层实现

1.4 什么是数据库中的锁

  1. 锁的主要作用是管理共享资源的并发访问
  2. 锁用于实现事物的隔离性
  3. 所保证一个用户写入数据时候另一个用户进行写的时候会被阻塞

锁的类型

  • 共享锁(读锁)
  • 独占锁(写锁)

独占锁以及共享锁演示

代码语言:javascript
复制
begin  # 开启一个事务
insert into myinnodb values(3,'bb');
update myinnodb set name='bbbb' where id =2; # 更新name字段的值为bbbb
其实innodb在锁的方面还是比较复杂的 了解即可
加入表级别的独占锁
mysql> lock table myinnodb write;
mysql> unlock table;

当存在锁的情况下 select的语句会被阻塞需要进行解锁

锁的粒度

  • 表级锁 通过mysql的服务器层实现
  • 行级锁

阻塞和死锁

  • 阻塞是为了保证并发的正常运行
    • 过多的阻塞会导致数据库的连接进行堆积
  • 死锁是两个或两个以上的事务在执行的过程中占用相互等待的资源导致异常,少量死锁不会有影响
    • 当有大量的死锁就会有问题了

1.5 Innodb状态检查

代码语言:javascript
复制
show engine innodb status # 间隔30s进行采样 
主要是包括一些 I/O读写进程 一些配置页 缓存信息 索引等等
*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
=====================================
2020-09-17 23:22:26 0x7f371091e700 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 21 seconds # 21秒的统计值

适用场景

  • 适合于大多数的OLTP应用
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.0 系统表空间和独立表空间怎么选
  • 1.1 如何把原来存在于系统表空间的表转移到独立表空间
  • 1.3 Innodb存储引擎的特性
  • 1.4 什么是数据库中的锁
  • 1.5 Innodb状态检查
  • 适用场景
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档