MySQL InnoDB存储引擎(一):简介

JerryXia 发表于 , 阅读 (0)

对于MySQL,大家应该不会陌生,对于数据库,其最重要核心的功能就是如何存储,检索数据库,这将取决于其使用的存储引擎,在MySQL中,有一些可选的存储引擎,如InnoDBMyISAMMEMORY等,其中使用最为广泛的则是InnoDB,因为无论从高可用高性能等方面,其能满足大多数的应用场景,本文将对MySQLInnoDB存储引擎作一些基本简介,将基于MySQL 5.7

InnoDB存储引擎简介

InnoDB作为比较通用的存储引擎,其在高可用高性能两方面作了较好的平衡,因此也作为了MySQL的默认存储引擎。相较于其他存储引擎,InnoDB有几点关键的优势:

DML操作支持ACID模型(关于ACID,可以看下之前的这篇文章),事务的提交回滚,以及在服务器崩溃后的恢复能力;
具有的行级锁和Oracle风格的一致性读,以提升多用户的并发访问性能;
InnoDB表会基于主键为查询操作作一些存储优化,每一个InnoDB表都具有一个叫作聚簇索引的主键索引,使得在进行主键查询时,可以最小化I/O操作;
为了保证数据完整性InnoDB支持外键约束。通过外键,可以在进行数据插入,更新,删除时,对数据进行校验,以避免不同表之间的数据不一致问题。

下表是InnoDB的一些特性:

innodb-features.png

使用InnoDB表的好处

相较于MyISAM等存储类型的表,InnoDB表具有以下一些优势:

如果你的服务器因为硬件或软件原因导致崩溃,重启数据库后,并不需要作额外的工作,InnoDB将自动恢复处理,比如执行完崩溃前已经提交的事务回滚未提交的事务等;
InnoDB存储引擎会维护自己的缓冲池,用于将表和索引数据缓存在内存中,因此频繁使用的数据将直接从内存中获取。对于专用的数据库服务器上,基本可以使用80%的内存用于该缓冲池;
对于不同表之间的数据,InnoDB提供了外键约束来保证数据完整性
如果数据在内存或磁盘中损坏,InnoDB校验和机制会在你使用该数据前,作出提醒;
如果使用的InnoDB表具有主键列,那么涉及到主键列的一些操作会自动被优化,比如WHEREORDER BYGROUP BY等子句,或join操作;
插入,更新,删除操作将被名为写缓冲区的机制自动优化,InnoDB不仅允许并发读写相同的表,并且能缓存更新的数据,以简化磁盘I/O操作;
性能优势并不会受限于对大型表的长时间运行的查询操作,当表中某一行记录被反复访问时,InnoDB自适应哈希索引将使得这些查询变得更快,类似于从哈希表中获取数据;
InnoDB允许压缩表和相关的索引;
创建或删除索引对性能可用性影响很小;
执行Truncate表十分高效,并能及时释放对应的磁盘空间供操作系统重用,而不是供InnoDB引擎重用;
通过动态的行格式,对BLOB长文本数据类型的数据存储更有效;
可以通过INFORMATION_SCHEMA表的数据监控存储引擎的内部运行状况;
可以通过Performance Schema表的数据监控存储引擎的性能细节;
可以混用InnoDB存储引擎与其他存储引擎,比如在同一个查询中join不同存储引擎的表;
InnoDB在作处理大数据量时,针对CPU效率和最大性能作了针对设计;
InnoDB能够处理大量数据,即使操作系统的文件大小限制为2G。

有关InnoDB表的最佳实践

以下是使用InnoDB表的一些最佳实践:

为每张表指定一个主键,通常为需要频繁查询的列,如果没有明显的主键,可以指定一个自增列;
在使用JOIN时,尽量基于记录ID(主键)。使用外键时,为了提升性能关联列被关联列应尽量使用相同数据类型。添加外建时,也尽量为被关联列添加索引;
关闭自动提交,每秒成百上千次提交将直接影响性能(受限于存储设备的写速度);
将多个相关的DML操作通过START TRANSACTIONCOMMIT包装为一个事务
不要使用锁表语句,InnoDB表支持行锁( SELECT ... FOR UPDATE),允许并发读写同一张表的不同记录;
开启innodb_file_per_table选项,使得每张表单独存储自己的数据和索引;
评估数据存储和访问模式,是否会受益于compression特性(CREATE TABLE时指定ROW_FORMAT=COMPRESSED);
运行Mysql Server时开启选项--sql_mode=NO_ENGINE_SUBSTITUTION,禁止表以不同的存储引擎创建,若有特例,可以通过CREATE TABLEENGINE=子句来指定。

检查数据库是否支持InnoDB存储模型

可以通过SHOW ENGINGES来检查当前数据库是否支持InnoDB

mysql> SHOW ENGINES;+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        || MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         || MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         || BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         || MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         || CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         || ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         || PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         || FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+    

或者直接查询INFORMATION_SCHEMA库的ENGINES表:

mysql> use INFORMATION_SCHEMA;mysql> SELECT * FROM ENGINES;# 同上    

ENGINES中没有InnoDB,则可能需要重新安装支持InnoDB的MySQL版本;若InnoDB没有开启,在启动Mysql时,去掉skip-innodb相关的选项(这些选项在MySQL 5.7.5及之后已经无效)。另外,可以通过--default-storage-engine=InnoDB指定InnoDB为默认的存储引擎。

若想禁用InnoDB存储引擎,可以在启动MySQL时使用--innodb=OFF参数。

InnoDB与ACID模型

ACID模型作为数据库设计的重要原则,其强调了对业务数据和关键应用的可靠性方面的重要性。MySQL包含了一些组件,如InnoDB存储引擎,实现了ACID模型,这样可以保证数据不会损坏,或者不会因为软件崩溃和硬件故障导致数据异常。当你的应用需要依赖ACID特性时,就不再需要再作一致性校验故障恢复等。如果你的应用已经从程序上保证了一定的一致性,或者具有高可靠的意见,又或应用允许一定的数据不一致,丢失等,那么你可以调整MySQLACID可靠性配置,以获取更好的性能吞吐量

InnoDB存储引擎如何与ACID模型相互作用

Atomicity(原子性)

InnoDB原子性主要体现在事务

自动提交(Autocommit)设置;