现在的位置: 首页 > 综合 > 正文

MySQL 引擎 和 InnoDB并发控制 简介

2013年01月04日 ⁄ 综合 ⁄ 共 1912字 ⁄ 字号 评论关闭

 

 

       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

 

 

几个常用的存储引擎:

1MyISAM它主要用于大多数的Web、数据仓库和其它应用中。可以通过数据库配置文件中的storage_engine选项来改变默认的存储引擎。

2InnoDB主要用于事务处理应用,并且支持事务的ACID特性和外键。

3BDB支持COMMITROLLBACK和其它事务特性。

 

 

在创建表或修改表的时候,都可以指定需要使用的存储引擎:

       SQL>CREATE TABLE engineTest (id INT) ENGINE = MyISAM;

       SQL>ALTER TABLE engineTest ENGINE = ARCHIVE;

 

       虽然InnoDBBDB都支持事务,但是相比而已InnoDB支持得更好。

 

       InnoDB通过多版本并发控制MVCC来支持事务的,允许COMMIT, ROLLBACKsvepoints BDB支持事务,只是允许COMMITROLLBACK

 

       由于我们主要研究MySQL的多版本并发控制机制,因此,后面主要是解析InnoDB存储引擎的代码。

       InnoDB的设计是为了在处理大数据量的时候得到最好的性能InnoDB存储引擎维护了一个它自己的缓冲区,用来存储数据和索引。InnoDB将表和索引存储在一个表空间中,这个表空间可能由不同的文件组成。而MyISAM存储引擎的表中每个表都存在一个独立的文件里面。

       和达梦一样InnoDB的每个表都对应了一个相应的聚簇索引,如果表上有主键的话,则聚簇索引使用主键作为索引键,如果没有主键的话,则选择第一个非空列的非唯一索引作为聚簇索引,如果都没有的话,则使用rowid作为索引键。

 

事务模型:

       InnoDB事务模型是将传统的两阶段封锁协议同多版本数据库特性相结合。它采用加行级锁和查询不加锁

 

锁模型:

有两种类型的锁,共享锁和排它锁

1)共享锁S允许事务读一条记录

2)排它锁X允许事务更新或删除一条记录

 

如果事务T1拥有行t上的共享锁,那么:

       如果其它事务T2请求t上的S锁,那么可以被立即授予。这样T1T2都拥有t上的S锁。

       如果其它事务T2请求t上的X锁,那么不能被授予。

 

       如果事务T1拥有行t上的X锁,那么其它事务请求t上的任何锁都不能被授予。 另外,InnoDB支持多种上锁粒度,它允许同时加行锁和表锁。为了支持多粒度锁,引入了一个新的锁,意向锁。意向锁是加在表上的锁。意向锁就是表明某个事务之后要对这个表上的某个行加该类型的锁。

       共享意向锁IS,表明事务T将要在表T的某些行上加S锁。

       排他意向锁IX表明事务T将要在表T的某些行上加X

 

意向锁协议是:

【上篇】
【下篇】

抱歉!评论已关闭.