MySQL存储引擎
本文主要对MySQL数据库引擎做一个简单介绍,MySQL存储引擎主要分为内建引擎与第三方引擎。
内建引擎:InnoDB、MyISAM、Archive、Blackhole、CSV、Federated、Memory、Merge、NDB;
第三方存储引擎:OLTP、Infobright、Aria、Groonga、OQGraph、Q4M、SphinxSE、Spider;
一、表信息
创建一个名为MyTable的表,MySQL会在MyTable.frm文件中保存该表的定义,可以使用SHOW TABLE STATUS命令显示表的相关信息。
C:\Program Files\MySQL\MySQL Server 5.7\bin>mysql -u root -p --xml Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.7.18-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use mysql; Database changed mysql> show table status like 'user' \g; <?xml version="1.0"?>
<resultset statement="show table status like 'user';" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <row> <field name="Name">user</field> <field name="Engine">MyISAM</field> <field name="Version">10</field> <field name="Row_format">Dynamic</field> <field name="Rows">2</field> <field name="Avg_row_length">132</field> <field name="Data_length">264</field> <field name="Max_data_length">281474976710655</field> <field name="Index_length">4096</field> <field name="Data_free">0</field> <field name="Auto_increment" xsi:nil="true" /> <field name="Create_time">2017-11-20 08:15:01</field> <field name="Update_time">2018-01-20 16:31:36</field> <field name="Check_time" xsi:nil="true" /> <field name="Collation">utf8_bin</field> <field name="Checksum" xsi:nil="true" /> <field name="Create_options"></field> <field name="Comment">Users and global privileges</field> </row> </resultset> 1 row in set (0.00 sec) |
Max_data_length
表数据的最大容量,该值和存储引擎有关。
Index_length
索引的大小(以字节为单位)。
Data_free
对于MyISAM表,表示已分配但目前没有使用的空间。这部分空间包括了之前删除的行,以及后续可以被INSERT利用到的空间。
Auto_increment
下一个AUTO_INCREMENT的值。
Create_time
表的创建时间。
Update_time
表数据的最后修改时间。
Check_time
使用CKECK TABLE命令或者myisamchk工具最后一次检查表的时间。
Collation
表的默认字符集和字符列排序规则。
Checks
二、InnoDB存储引擎
MySQL5.1以后InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。InnoDB采用MVCC来支持高并发,Innodb引擎提供了对数据库ACID事务的支持和行级锁,并且实现了四个标准的隔离级别。InnoDB的性能和自动崩溃恢复特性,使得它在非事务型存储的需求中也很流行。作为事务型的存储引擎,InnoDB通过一些机制和工具支持真正的热备份,Oracle提供的MySQL Enterprise Backup、Percona提供的开源的XtraBackup都可以做到这一点。MySQL的其他存储引擎不支持热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。
InnoDB表是基于聚簇索引建立的,InnoDB的索引结构和MySQL的其他存储引擎有很大的不同,聚簇索引对主键查询有很高的性能。不过它的二级索引(secondary index,非主键索引)中必须包含主键列,所以如果主键列很大的话,其他的所有索引都会很大。因此,若表上的索引较多的话,主键应当尽可能的小。InnoDB的存储格式是平台独立的,也就是说可以将数据和索引文件从Intel平台复制到PowerPC或者Sun SPARC平台。
InnoDB有着复杂的发布历史,了解一下这段历史对于理解InnoDB很有帮助。2008年,发布了所谓的InnoDB plugin,适用于MySQL 5.1版本,但这是Oracle创建的下一代InnoDB引擎,其拥有者是InnoDB而不是MySQL。这基于很多原因,这些原因如果要一一道来,恐怕得喝掉好几桶啤酒。MySQL默认还是选择了集成旧的InnoDB引擎。当然用户可以自行选择使用新的性能更好、扩展性更佳的InnoDB plugin来覆盖旧的版本。直到最后,在Oracle收购了Sun公司后发布的MySQL 5.5中才彻底使用InnoDB plugin替代了旧版本的InnoDB(是的,这也意味着InnoDB plugin已经是原生编译了,而不是编译成一个插件,但名字已经约定俗成很难更改)。 这个现代的InnoDB版本,也就是MySQL 5.1中所谓的InnoDB plugin,支持一些新特性,诸如利用排序创建索引(building index by sorting)、删除或者增加索引时不需要复制全表数据、新的支持压缩的存储格式、新的大型列值如BLOB的存储方式,以及文件格式管理等。很多用户在MySQL 5.1中没有使用InnoDB plugin,或许是因为他们没有注意到有这个区别。所以如果你使用的是MySQL 5.1,一定要使用InnoDB plugin,真的比旧版本的InnoDB要好很多。 InnoDB是一个很重要的存储引擎,很多个人和公司都对其贡献代码,而不仅仅是Oracle公司的开发团队。一些重要的贡献者包括Google、Yasufumi Kinoshita、Percona、Facebook等,他们的一些改进被直接移植到官方版本,也有一些由InnoDB团队重新实现。在过去的几年间,InnoDB的改进速度大大加快,主要的改进集中在可测量性、可扩展性、可配置化、性能、各种新特性和对Windows的支持等方面。MySQL 5.6实验室预览版和里程碑版也包含了一系列重要的InnoDB新特性。 为改善InnoDB的性能,Oracle投入了大量的资源,并做了很多卓有成效的工作(外部贡献者对此也提供了很大的帮助)。在本书的第二版中,我们注意到在超过四核CPU的系统中InnoDB表现不佳,而现在已经可以很好地扩展至24核的系统,甚至在某些场景,32核或者更多核的系统中也表现良好。很多改进将在即将发布的MySQL 5.6中引入,当然也还有机会做更进一步的改善。 |
三、MyISAM存储引擎
在MySQL 5.1及之前的版本,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,而且有一个毫无疑问的缺陷就是崩溃后无法安全恢复。
MyISAM对整张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入时则对表加排他锁。但是在表有读取查询的同时,也可以往表中插入新的记录(这被称为并发插入,CONCURRENT INSERT)。
MyISAM引擎设计简单,数据以紧密格式存储,所以在某些场景下的性能很好。MyISAM有一些服务器级别的性能扩展限制,比如对索引键缓冲区(key cache)的Mutex锁,MariaDB基于段(segment)的索引键缓冲区机制来避免该问题。但MyISAM最典型的性能问题还是表锁的问题,如果你发现所有的查询都长期处于“Locked”状态,那么毫无疑问表锁就是罪魁祸首。
四、Archive引擎
Archive存储引擎只支持INSERT和SELECT操作,在MySQL 5.1之前也不支持索引。
Archive引擎会缓存所有的写并利用zlib对插入的行进行压缩,所以比MyISAM表的磁盘I/O更少。但是每次SELECT查询都需要执行全表扫描。所以Archive表适合日志和数据采集类应用,这类应用做数据分析时往往需要全表扫描。或者在一些需要更快速的INSERT操作的场合下也可以使用。
Archive引擎支持行级锁和专用的缓冲区,所以可以实现高并发的插入。
五、Blackhole引擎
Blackhole引擎没有实现任何的存储机制,它会丢弃所有插入的数据,不做任何保存。但是服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者只是简单地记录到日志。这种特殊的存储引擎可以在一些特殊的复制架构和日志审核时发挥作用。但这种应用方式我们碰到过很多问题,因此并不推荐。
六、CSV引擎
CSV引擎可以将普通的CSV文件(逗号分割值的文件)作为MySQL的表来处理,但这种表不支持索引。CSV引擎可以在数据库运行时拷入或者拷出文件。可以将Excel等电子表格软件中的数据存储为CSV文件,然后复制到MySQL数据目录下,就能在MySQL中打开使用。同样,如果将数据写入到一个CSV引擎表,其他的外部程序也能立即从表的数据文件中读取CSV格式的数据。因此CSV引擎可以作为一种数据交换的机制,非常有用。
七、Federated引擎
Federated引擎是访问其他MySQL服务器的一个代理,它会创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,然后提取或者发送需要的数据。最初设计该存储引擎是为了和企业级数据库如Microsoft SQL Server和Oracle的类似特性竞争的,可以说更多的是一种市场行为。尽管该引擎看起来提供了一种很好的跨服务器的灵活性,但也经常带来问题,因此默认是禁用的。MariaDB使用了它的一个后续改进版本,叫做FederatedX。
八、Memory引擎
如果需要快速地访问数据,并且这些数据不会被修改,重启以后丢失也没有关系,那么使用Memory表(以前也叫做HEAP表)是非常有用的。Memory表至少比MyISAM表要快一个数量级,因为所有的数据都保存在内存中,不需要进行磁盘I/O。Memory表的结构在重启以后还会保留,但数据会丢失。
Memroy表在很多场景可以发挥好的作用:
用于查找(lookup)或者映射(mapping)表,例如将邮编和州名映射的表。
•用于缓存周期性聚合数据(periodically aggregated data)的结果。
•用于保存数据分析中产生的中间数据。
Memory表支持Hash索引,因此查找操作非常快。虽然Memory表的速度非常快,但还是无法取代传统的基于磁盘的表。Memroy表是表级锁,因此并发写入的性能较低。它不支持BLOB或TEXT类型的列,并且每行的长度是固定的,所以即使指定了VARCHAR列,实际存储时也会转换成CHAR,这可能导致部分内存的浪费(其中一些限制在Percona版本已经解决)。
如果MySQL在执行查询的过程中需要使用临时表来保存中间结果,内部使用的临时表就是Memory表。如果中间结果太大超出了Memory表的限制,或者含有BLOB或TEXT字段,则临时表会转换成MyISAM表。人们经常混淆Memory表和临时表。临时表是指使用CREATE TEMPORARY TABLE语句创建的表,它可以使用任何存储引擎,因此和Memory表不是一回事。临时表只在单个连接中可见,当连接断开时,临时表也将不复存在。
九、NDB集群引擎
2003年,当时的MySQL AB公司从索尼爱立信公司收购了NDB数据库,然后开发了NDB集群存储引擎,作为SQL和NDB原生协议之间的接口。MySQL服务器、NDB集群存储引擎,以及分布式的、share-nothing的、容灾的、高可用的NDB数据库的组合,被称为MySQL集群(MySQL Cluster)。
查看原文:http://www.coder306.cn/?p=109