MySQL存储引擎采用了可插拔的结构,即用户可以根据自己的需要来选择不同的存储引擎。
下表是MySQL不同的存储引擎的不同的特性:
Feature |
MyISAM |
BDB |
Memory |
InnoDB |
Archive |
NDB |
Storage limits |
256TB |
No |
Yes |
64TB |
No |
384EB[4] |
Transactions |
No |
Yes |
No |
Yes |
No |
Yes |
Locking granularity |
Table |
Page |
Table |
Row |
Row |
Row |
MVCC (snapshot read) |
No |
No |
No |
Yes |
Yes |
No |
Geospatial support |
Yes |
Yes[1] |
No |
Yes[1] |
Yes[1] |
Yes[1] |
B-tree indexes |
Yes |
Yes |
Yes |
Yes |
No |
Yes |
Hash indexes |
No |
No |
Yes |
No |
No |
Yes |
Full-text search indexes |
Yes |
No |
No |
No |
No |
No |
Clustered indexes |
No |
Yes |
No |
Yes |
No |
No |
Data caches |
No |
Yes |
N/A |
Yes |
No |
Yes |
Index caches |
Yes |
Yes |
N/A |
Yes |
No |
Yes |
Compressed data |
Yes |
No |
No |
No |
Yes |
No |
Encrypted data[2] |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Cluster database support |
No |
No |
No |
No |
No |
Yes |
Replication support[3] |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Foreign key support |
No |
No |
No |
Yes |
No |
No |
Backup / point-in-time recovery[3] |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Query cache support |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Update statistics for data dictionary |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
几个常用的存储引擎:
(1)MyISAM:它主要用于大多数的Web、数据仓库和其它应用中。可以通过数据库配置文件中的storage_engine选项来改变默认的存储引擎。
(2)InnoDB:主要用于事务处理应用,并且支持事务的ACID特性和外键。
(3)BDB:支持COMMIT,ROLLBACK和其它事务特性。
在创建表或修改表的时候,都可以指定需要使用的存储引擎:
SQL>CREATE TABLE engineTest (id INT) ENGINE = MyISAM;
SQL>ALTER TABLE engineTest ENGINE = ARCHIVE;
虽然InnoDB和BDB都支持事务,但是相比而已InnoDB支持得更好。
InnoDB通过多版本并发控制MVCC来支持事务的,允许COMMIT, ROLLBACK和svepoints。 而BDB支持事务,只是允许COMMIT和ROLLBACK。
由于我们主要研究MySQL的多版本并发控制机制,因此,后面主要是解析InnoDB存储引擎的代码。
InnoDB的设计是为了在处理大数据量的时候得到最好的性能。InnoDB存储引擎维护了一个它自己的缓冲区,用来存储数据和索引。InnoDB将表和索引存储在一个表空间中,这个表空间可能由不同的文件组成。而MyISAM存储引擎的表中每个表都存在一个独立的文件里面。
和达梦一样InnoDB的每个表都对应了一个相应的聚簇索引,如果表上有主键的话,则聚簇索引使用主键作为索引键,如果没有主键的话,则选择第一个非空列的非唯一索引作为聚簇索引,如果都没有的话,则使用rowid作为索引键。
事务模型:
InnoDB事务模型是将传统的两阶段封锁协议同多版本数据库特性相结合。它采用加行级锁和查询不加锁。
锁模型:
有两种类型的锁,共享锁和排它锁
(1)共享锁S允许事务读一条记录
(2)排它锁X允许事务更新或删除一条记录
如果事务T1拥有行t上的共享锁,那么:
如果其它事务T2请求t上的S锁,那么可以被立即授予。这样T1和T2都拥有t上的S锁。
如果其它事务T2请求t上的X锁,那么不能被授予。
如果事务T1拥有行t上的X锁,那么其它事务请求t上的任何锁都不能被授予。 另外,InnoDB支持多种上锁粒度,它允许同时加行锁和表锁。为了支持多粒度锁,引入了一个新的锁,意向锁。意向锁是加在表上的锁。意向锁就是表明某个事务之后要对这个表上的某个行加该类型的锁。
共享意向锁IS,表明事务T将要在表T的某些行上加S锁。
排他意向锁IX,表明事务T将要在表T的某些行上加X锁
意向锁协议是: