InnoDB 是通用的存储引擎,在高可用和高性能之间做了折中。在MySQL8.0中,InnoDB是默认的存储引擎。除非你需要配置一个不一样的存储引擎,则在create table
语句时添加ENGINE=存储引擎
来指定其他的存储引擎。
Feature | Support |
---|---|
B-tree indexes | Yes |
Backup/point-in-time recovery (Implemented in the server, rather than in the storage engine.) | Yes |
Cluster database support | No |
Clustered indexes | Yes |
Compressed data | Yes |
Data caches | Yes |
Encrypted data | Yes (Implemented in the server via encryption functions; In MySQL 5.7 and later, data-at-rest tablespace encryption is supported.) |
Foreign key support | Yes |
Full-text search indexes | Yes (InnoDB support for FULLTEXT indexes is available in MySQL 5.6 and later.) |
Geospatial data type support | Yes |
Geospatial indexing support | Yes (InnoDB support for geospatial indexing is available in MySQL 5.7 and later.) |
Hash indexes | No (InnoDB utilizes hash indexes internally for its Adaptive Hash Index feature.) |
Index caches | Yes |
Locking granularity | Row |
MVCC | Yes |
Replication support (Implemented in the server, rather than in the storage engine.) | Yes |
Storage limits | 64TB |
T-tree indexes | No |
Transactions | Yes |
Update statistics for data dictionary | Yes |
where
、order by
、group by
和join
操作中引用主键是很快的。
change buffering
的自动机制优化。InnoDB并不仅仅允许并发读和写,还缓存了变更的数据流到磁盘I/O。
change buffering
的说明: 由 insert buffering
、delete buffering
和purge buffering
组成。SQL语句导致的索引变更,一般会造成随机I/O操作,会被后台线程hold住,并且定期执行。这种包含一系列的索引值的操作序列可以写入磁盘块以提升效率,而不是每次变更就立马写入。可以通过配置innodb_change_buffering
和innodb_change_buffer_max_size
选项来控制。适自适应的哈希索引
机制会使得这些查询更加快,好像他们是从哈希表中获取的一样。
Adaptive hash index
自适应哈希索引: =
、in
操作查询的时候,通过在内存中构造一个哈希索引
来加快查询速度。MySQL监听InnoDB表的索引查询,如果查询会得益于一个哈希索引,则会自动构建一个索引页用于频繁的访问。在某种意义上,自适应哈希索引会在运行时配置MySQL以合理利用主存储,更接近主内存的数据库的体系结构。这个特性可以被innodb_adaptive_hash_index
配置项控制。因为这项操作对某些公国负载有利,对其他则不利,由于哈希索引的存储保存在缓冲池中,所以一般而言,你需要对那些有利、不利的特性进行基准测试。哈希索引也是基于表已存在的B树来构建的,MySQL 可以为B树索引的任意长度的前缀建立哈希索引,依赖于针对索引的查询模式。一个哈希索引只是部分的,完整的B树索引不需要在缓冲池中缓存。在MySQL5.6以及更高的版本中,有另外一种方式提高单个值的查询–使用InnoDB的memcached
插件。file-per-table
是很快的,可以释放磁盘空使得这个操作系统都可以重用,而不是释放系统表空间只有InnoDB可以使用。
本部分描述使用InnoDB引擎表的最佳实践.
primary key
。
join
套用唯一id进行连接多个表的查询。为了提升join的性能,在join的列上定义外键foreign keys,并且在各个表中将它们声明为相同的数据类型。添加外键确保被引用的列都是有索引的,这样可以提升性能。外键可以在删除或者修改数据的时候,传播到所有被影响的表中,并且会阻止子表中的插入操作—如果关联的id没有在父表中不存在的话。
start transaction
和commit
语句将他们括起来的。如果你不想提交太频繁的话,你也不想处理大批量可能在没有提交的情况下会运行数小时的insert、update或者detele语句。
LOCK tables
语句。InnoDB 可以一次处理多个读、写的会话,而不太影响可用性和高性能。如果要获得访问的行记录的独占读写权限,你可以使用SELECT...FOR UPDATE
语法去锁住你想修改的记录行。
innodb_file_per_table
操作或者使用通用的表空间将表的数据和索引分开存储到不同的文件,而不是使用系统表空间。
innodb_file_perm_table
配置项默认是开启的。
--sql_mode=NO_ENGINE_SUBSTITUTION
选项操作运行你的服务器,如果CREATE TABLE
语句指定的ENGINE
=clause存在问题则会阻止使用不同的存储引擎创建表。
使用SHOW ENGINES
语句来查看可用的MySQL存储引擎,可以看到InnoDB是默认的:
SHOW ENGINES ;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JJj4vF89-1569579176862)(pictures/001查看可用的存储引擎.png)]
也可以通过查询INFORMATION_SCHEMA.ENGINES表来获取信息:
SELECT * FROM INFORMATION_SCHEMA.ENGINES;
如果InnoDB不是你的默认存储引擎,你可以考虑使用--default-storage-engine=InnoDB
配置选项在你的命令行启动服务、或者在你的配置文件的[mysqld]部分配置default-storage-engine=innodb
选项来定义使用InnoDB作为默认的存储引擎。
因为变更存储引擎仅仅影响新创建的表,所以运行所有应用程序安装和设置步骤,以确保所有内容都正确安装。然后练习所有的应用特性确保所有的数据都被加载、编辑、查询特性运行OK。如果一个表依赖于其他存储引擎的特性,你将得到一个error。在你的CREATE TABLE语句中添加ENGINE=other_engine_name子句避免这个错误。
如果你没有对存储引擎做出慎重的决定,并且你希望预览这些表是如何在创建的时候使用InnoDB存储引擎来工作的,可以使用命令ALTER TABLE table_name ENGINE=InnoDB;
。或者运行一个测试查询其他语句而不影响原表,做一个副本拷贝:
CREATE TABLE InnoDB_Table (...) ENGINE=InnoDB AS SELECT * FROM other_engine_table;
如果要对引用在真实负载下做一个性能测试,安装最新的MySQL服务版本运行基准测试benchmarks。
测试完整的应用生命周期,从安装、通过大量使用、重启服务。在数据库工作的时候杀死进程模拟一个电源故障,验证服务在重启的时候数据是否恢复成功了。
特使任意的复制配置信息,特别是如果你使用的不同版本的MySQL的主、从。
ACID 模型是一系列的数据库设计原则,强调可靠性对业务数据的重要性。MySQL包含和ACID紧密结合的InnoDB存储引擎组件,所以数据不会被破坏、也不会被异常情况发生导致扭曲存储。当你依赖兼容ACID特性的时候,你不需要重复造轮子去检查数据一致性和崩溃恢复机制。
原子性与InnoDB事务相关,关联的MySQL特性包含:
一致性与InnoDB处理和从崩溃中保护数据有关。关联的MySQL特性包含:
fsync()
调用。关闭doublewrite buffer,可以配置选项:innodb_doublewrite=0
。redo log
中获取数据恢复。在崩溃前提交的变更,但是还没有写入data files的数据,会从doublewrite buffer中重新构建。当数据库正常关闭的时候,这个动作是由puage操作完成的。在正常的操作期间,已提交的数据会被存储到change buffer中一段时间,才会被写入到data files。所以在保持数据是最新的时间存在一个权衡,这会在正常运行时引入额外开销,缓冲数据也会导致数据恢复的时间加长。隔离性与InnoDB事务相关,特别的隔离级别会应用于每一个事务。关联的MySQL特性如下:
SET ISOLATION LEVEL
语句持久性与MySQL软件的特性和你的硬件配置有关。因为很多依赖于CPU的性能、网络和存储设备。关联的MySQL特性包含:
innodb_doublewrite
开启。innodb_flush_log_at_trx_commit
sync_binlog
innodb_file_per_table
sync()
函数扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有