MySQL之存储引擎
一、存储引擎概述及查看方法
数据库是存储数据库对象的容器,是指长期存储在计算机内、有组织和可共享的数据的集合,只是其存储方式有特定的规律。存储引擎实际上就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据。 因为在关系数据库中数据是以表的形式存储的,所以,存储引擎也可以称为表类型。MySQL中的数据用不同的技术存储在文件(或者内存)中,每一种技术都使用不同的存储机制、索引技巧、锁定水平,并且最终提供广泛的、不同的功能和能力,选择不同的技术可以获得额外的速度或者功能,从而改善应用的整体功能。这些不同的技术配套的相关功能在MySQL中被称作存储引擎(或者表类型)。
Oracle和SQLserver等数据库中只有一种存储引擎,所有数据库管理机制都是一样的,但是MySQL提供了多种存储引擎,并且还提供了插件式(Pluggable)的存储引擎。 同一个数据库中不同的表可以使用不同的存储引擎,同一个数据库表在不同的场合可以使用不同的存储引擎。MySQL常用的存储引擎有InnoDB存储引擎和MyISAM存储引擎。
可用show engines
命令或者show variables like 'have%'
命令查看当前MySQL数据库支持的存储引擎。可以用分号‘;’结尾,或者用‘\g’和’\G’结尾。(;和\g作用是一样的,\G是为了查询结果美观)
Engine表示数据库存储引擎的名称;Support表示MySQL是否支持该类型存储引擎,YES表示支持,NO表示不支持,DEFAULT表示当前数据库默认使用的存储引擎;Comment表示对该存储引擎的解释说明;XA表示是否满足分布式交易处理的XA规范,YES表示支持,NO表示不支持;Transactions表示是否支持事务处理,YES表示支持,NO表示不支持(数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全的不执行,即原子操作);Savepoints表示是否支持保存点,以便事务回滚到保存点,YES表示支持,NO表示不支持。
Value显示DISABLE和YES的标记表示支持该存储引擎,前者表示数据库启动的时候被禁用,NO则表示当前数据库不支持该存储引擎。
可以用show variables like '%storage_engine%';
查看当前数据库默认的存储引擎。
二、InnoDB存储引擎
InnoDB是MySQL AB发布binary的标准之一,是为处理巨大数据量时的最大性能设计,CPU利用率最大化。InnoDB存储引擎完全与MySQL服务器整合,它为在主内存中缓存数据和索引而维护自己的缓冲池。 从MySQL5.6开始,InnoDB的表已经支持全文索引,文本检索能力大幅提升。相比于其他存储引擎,InnoDB是事务安全的(ACID兼容,即原子性、一致性、隔离性、持久性),提供行级锁(row level lock)来最大程度支持并发,支持外键(Foreign Key),是事务性数据库的首先,常常被用在需要高性能的大型数据库站点中。InnoDB是MySQL默认支持的存储引擎,其默认隔离是RR(Repeatable Read 可重复读),底层实现是B+树结构。
如果某张表主要提供OLTP(On-Line Transaction Processing联机事务处理)支持,需要执行大量的增删改操作,出于事务安全考虑,InnoDB是最好的选择。 对于支持事务的InnoDB表而言,影响执行速度的主要原因是打开了自动提交(autocommit)选项,或者程序没有显式调用“begin transaction(开始事务)”和“commit(提交事务)”,导致每条insert、delete或者update语句都自动开始事务和提交事务,严重影响了更新语句的执行效率。让多条更新语句形成一个事务可以大大提高更新操作的性能。
对于InnoDB存储引擎的数据表而言,存在表空间的概念,InnoDB表空间划分为共享表空间和独享表空间。MySQL服务实例(instance)承载的所有数据库的所有InnoDB表的数据信息、索引信息、各种元数据信息以及事务的回滚信息,全部都放在共享表空间文件中。默认情况下,该文件位于数据库的根目录下,文件名为ibdatal,可使用show variables like 'innodb_data_file_path';
命令来查看该文件的属性。如果将全局系统变量innodb_file_per_table的值设置为ON(默认为OFF),则之后创建InnoDB存储引擎的新表时,这些表的数据信息、索引信息将保存到独享表空间文件中。
InnoDB存储引擎相比于MyISAM需要占用较多的磁盘和内存空间,没有键压缩,不保存表的行数(执行select count(*) from table_name时,需要扫描一遍整个表来计算有多少行)且清空整个表时是一行一行的删除,效率非常慢,此外,InnoDB不会创建目录,所有信息都保存在ibdatal文件中。InnoDB适用场景是需要事务支持、高并发(提供行级锁)并且需要使用外键的场景,但需要确保查询是通过索引完成的,且数据更新操作比较频繁。
注意事项:使用InnoDB时,主键尽可能小来避免给Secondary index带来过大的空间负担;避免全表扫描(因为会使用到表锁);尽可能缓存所有的索引和数据,提高响应速度;在大批量小插入的时候要合理设置innodb_flush_log_at_trx_commit的参数值;尽量自己控制事务而不要使用autocommit来自动提交;不要过度追求安全性,避免主键更新(因为主键更新会带来大量的数据移动)。
三、MyISAM存储引擎
MyISAM是MySQL5.5以前的默认存储引擎,是基于传统的ISAM(Indexed Sequential Access Method 有索引的顺序访问方法)类型,是存储记录和文件的标准方法。MyISAM存储引擎具有检查和修复表格的大多数工具,其表格可以被压缩,支持全文搜索,但不是事务安全的,也不支持外键,提供OLAP(On-Line Anallytical Processing 联机分析处理)支持,只支持表锁(在更新资源时将表进行锁定,降低了并发性能),读取速度快占用资源少。使用MyISAM时,如果事务回滚将造成不完全事务回滚,即不具有原子性。 如果某张表需要执行大量的select查询操作时,出于性能方面的考虑,MyISAM存储引擎是更好的选择。MyISAM支持三种存储格式:静态表(一般情况下默认是静态表)、动态表和压缩表。适用场景是不需要事务支持、并发相对较低、数据修改相对较少、以读为主、数据一致性要求不是非常高的情况。
注意事项:尽量索引(缓存机制);调整读写的优先级,根据实际需求来确保重要操作更优先;启用延迟插入改善大批量写入性能,尽量顺序操作让insert数据写入到尾部,减少阻塞,分解大的操作,降低单个操作的阻塞时间;降低并发数,某些高并发场景通过应用来进行排队机制;对于相对静态的数据,充分利用Query Cache可以极大地提高访问效率;MyISAM的count只有在全表扫描的时候特别高效,其他带有条件的count都需要进行实际的数据访问。
四、MEMORY存储引擎
MEMORY存储引擎(以前叫做HEAP存储引擎)是将表中的数据存放在内存中,如果数据库发生重启或者崩溃,表中的数据都将消失(需要进行安全检查),非常适合用来存储临时数据的临时表, 以及数据仓库中的纬度表。MEMORY默认使用哈希(HASH)索引(哈希索引速度快于B型树索引),但只支持表锁,并发性能差,且不支持TEXT和BLOB文本类型的列类型,同时,在存储变长字段varchar时是按照定长字段char的方式进行的,会造成内存上的浪费。 此外有一点经常被忽视的是,MySQL使用MEMORY作为临时表来存放查询的中间结果集,如果中间结果集大于MEMORY存储引擎表的设置容量,或者中间结果集中含有TEXT和BLOB列类型字段,则MySQL会将其转换到MyISAM存储引擎表而存放到磁盘,这时产生的临时表的性能对于查询会有损失。MEMORY存储引擎适用于需要很快的读写速度、对数据安全性要求较低的情况。
注意事项:MEMORY存储引擎对表的大小有要求,不能是太大的表。
五、MERGE存储引擎
MERGR存储引擎是一组表结构完全相同的MyISAM表的组合,MERGE表本身没有数据,对MERGE类型的表可以进行查询、更新、删除操作(实际上是对内部的MyISAM表进行的操作)。 对于MERGR类型的表的插入操作是通过INSERT_METHOD字句定义插入的表,可以有三个不同的值,使用FIRST或者LAST值可以使得插入操作被相应的用在第一个或者最后一个表上,不定义INSERT_METHOD字句或者定义为NO,表示该MERGE表不能执行插入操作。对MEGRE表进行DROP操作,只是删除了MERGE的定义,对内部的表没有任何影响。 MERGE表在磁盘上保留两个文件,文件名以表的名字开始,一个.frm的文件存储表的定义,另一个.MRG文件包含组合表的信息,包括MERGE表由哪些表组成、插入新的数据时的依据,可以通过修改.MRG文件来修改MERGE表,但修改后要通过FLUSH TABLES进行刷新。
六、其他存储引擎
1、BLACKHOLE存储引擎
恰如其名,BLACKHOLE存储引擎就像一个黑洞一样,不管写入任何信息都是有去无回的,不能存储数据,但MySQL还是会正常记录下binlog(二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中),而这些binlog还会被正常的同步到slave上,可以在slave上对数据进行后续处理。 BLACKHOLE存储引擎一般用于以下三种场合:1>验证存储文件语法的正确性;2>来自二进制日志记录的开销测量,从而允许或禁止binlog功能的BLACKHOLE的性能;3>被用来查找与存储和引擎自身不相关的性能瓶颈。
2、CVS存储引擎
CVS存储引擎实际上操作的就是一个标准的CVS报表文件,它不支持索引, 主要用途是通过数据库中的数据导出成一份CVS报表文件(CVS是很多软件都支持的一种比较标准的格式)或导出备份。
3、ARCHIVE存储引擎
ARCHIVE存储引擎主要用于通过较小的存储空间来存放过期的很少访问的历史数据,不支持索引, 主要有一个.frm的结构定义文件、一个.ARZ的数据压缩文件还有一个.ARM的meta.信息文件。由于其所存放的数据的特殊性,ARCHIVE表不支持修改操作,仅做插入和查询操作,锁定机制为行级锁定。