一文读懂mysql的存储引擎之InnoDB与MyISAM

破局之路课程 2024-03-20 13:04:46
mysql的存储引擎概念:存储数据,为存储数据建立索引,更新查询数据。因为在关系数据库中数据以表的形式存储,所以存储引擎也叫表类型。MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、CSV、BLACKHOLE 等。可以使用SHOW ENGINES;语句查看系统所支持的引擎类型。Support 列的值表示某种引擎是否能使用,YES表示可以使用,NO表示不能使用,DEFAULT表示该引擎为当前默认的存储引擎。

存储引擎类型:

存储引擎

描述

ARCHIVE

用于数据存档的引擎,数据被插入后就不能再修改了,且不支持索引。

CSV

在存储数据时,会以逗号作为数据项之间的分隔符。

BLACKHOLE

会丢弃写操作,该操作会返回空内容。

FEDERATED

将数据存储在远程数据库中,用来访问远程表的存储引擎。

InnoDB

具备外键支持功能的事务处理引擎

MEMORY

置于内存的表

MERGE

用来管理由多个 MyISAM 表构成的表集合

MyISAM

主要的非事务处理存储引擎

NDB

MySQL 集群专用存储引擎

InnoDB存储引擎支持事务,是事务安全的。如果某张表需要执行大量的增(insert)、删(delete)、改(update)操作,出于事务安全方面的考虑,InnoDB存储引擎是更好的选择。支持外键InnoDB存储引擎的表支持全文索引,大幅提升了InnoDB存储引擎的文本检索能力。InnoDB表空间分为共享表空间、独享表空间。适用场景:需要事务支持、行级锁定对高并发有很好地适应能力,但需要确保查询是通过索引完成、数据更新较为频繁。InnoDB引擎调优:主键尽可能小,避免给secondary index带来过大的空间负担。避免全表扫描,因为会使用行级表锁。尽可能缓存所有的索引和数据,提高响应速度,减少磁盘I/O消耗。在执行大量插入操作的时候,尽量自己控制事务而不要使用autocommit自动提交。有开关可以控制提交方式。合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性。innodb_flush_log_at_trx_commit=0,表示每隔一秒把log buffer刷到文件系统中(os buffer)去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。也就是说一秒之前的日志都保存在日志缓冲区,也就是内存上,如果机器宕掉,可能丢失1秒的事务数据。innodb_flush_log_at_trx_commit=1,表示在每次事务提交的时候,都把log buffer刷到文件系统中(os buffer)去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。这样的话,数据库对IO的要求就非常高了,如果底层的硬件提供的IOPS比较差,那么MySQL数据库的并发很快就会由于硬件IO的问题而无法提升。innodb_flush_log_at_trx_commit=2,表示在每次事务提交的时候会把log buffer刷到文件系统中去,但并不会立即刷写到磁盘。如果只是MySQL数据库挂掉了,由于文件系统没有问题,那么对应的事务数据并没有丢失。只有在数据库所在的主机操作系统损坏或者突然掉电的情况下,数据库的事务数据可能丢失1秒之类的事务数据。这样的好处,减少了事务数据丢失的概率,而对底层硬件的IO要求也没有那么高(log buffer写到文件系统中,一般只是从log buffer的内存转移的文件系统的内存缓存中,对底层IO没有压力)。避免主键更新,因为会带来大量的数据移动。MyISAM存储引擎:特点这是MySQL早期(5.5之前)默认的存储机制,对事物支持不太好。基于传统的ISAM类型。ISAM( indexed sequential access method):有索引的顺序访问方法,是存储记录和文件的标准方法。不支持事务,不支持外键约束,但支持全文索引,这可极大地优化LIKE查询的效率。表级锁定(更新时锁定整个表):其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能。MyISAM不支持行级锁,只支持并发插入的表锁,主要用于高负载查询。读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读取本身并不会阻塞另外的读取。不缓存数据,只缓存索引:MyISAM可以通过key_buffer缓存以大大提高访问性能、减少磁盘I/O,但是这个缓存去只会缓存索引,而不会缓存数据。读取速度较快,占用资源相对较少。并发量较小,不适合大量UPDATE。MyISAM适用的生产业务场景:如果表主要用于插入新纪录和读出新纪录,那么选择MyISAM存储引擎能实现处理的高效率。如果应用的完整性和并发性要求很低,那么也可以选择MyISAM存储引擎。它是在Web、数据仓库和其他应用环境下最常用的存储引擎。单一对数据库的操作都可以使用MyISAM,所谓单一就是尽量纯读或纯写(insert,update,delete)等。生产建议:没有特别需求时,一律用InnoDB。不需要事务支持的业务,一般为读数据比较多的网站应用。并发相对较低的业务。数据修改相对较少的业务。以读为主的业务。对数据一致性要求不是非常高的业务。中小型网站的部分业务MyISAM引擎调优精要尽量使用索引,优先使用MySQL缓存机制。调整读写优先级,根据实际需要确保重要操作更优先。启用延迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次性写入)。尽量顺序操作让insert数据都写入到尾部,减少阻塞。分解大的操作,降低单个操作的阻塞时间。降低并发数,某些高并发场景通过应用进行排队机制。对于相对静态的数据,充分利用Query Cache可以极大地提高访问效率。MyISAM的count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问。把主从同步的主库使用InnoDB,从库使用MyISAM引擎。
0 阅读:0