zoukankan      html  css  js  c++  java
  • MySQL 引擎 和 InnoDB并发控制 简介

     

     

           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

     

    意向锁协议是:

           在某个事务请求行上的S锁之前,它必须先得到该行所在表的IS锁或更强的锁。

           在某个事务请求行上的X锁之前,它必须先得到该行所在表的IX锁。

    下面是锁的相容性矩阵:(相容为1,不相容为0

     

    X

    IX

    S

    IS

    X

    0   

    0

    0

    0

    IX

    0

    1

    0

    1

    S

    0

    0

    1

    1

    IS

    0

    1

    1

    1

     

    一个锁可以被授予被某个事务,如果事务请求的锁和已经上的锁相容。

     

    隔离级别:

           InnoDB默认隔离级别是REPEATABLE READInnoDB支持SQL标准的四个隔离级别。

     

    一致性非上锁读:

           InnoDB使用多版本的方式来控制一致性读,也就是说,给某个查询在该时刻的一个数据库的快照。这个查询可以看到这个时刻以前由其它事务提交的操作,而看不到之后做的改变或还未提交的改变。这个规则的唯一例外就是,事务可以看到本事务之前所做的还未提交的操作

           这个规则导致了下面的异常:如果你更新了某个表里面的行,使用SELECT将可以看见最新更新的行和老版本的行。如果其它事务同时更新相同的表,那么你就可能看到根本不可能在数据库中存在的状态。

           如果在某人的REPEATABLE READ隔离级别下的话,所有同一事物的所有一致性读都是读的第一次查询时建立的快照。如果想得到最新的快照的话,那么需要提交当前的事务,然后再开始新的查询。

           注意:DROP TABLE ALTER TABLE语句不使用一致性读。因为DROP TABLE的话,MYSQL不能使用已经删除了的表。而ALTER TABLE的时候,MYSQL是将原来的表复制一份,然后删除掉原来的表。

     

    Next-Key Locking:避免幻象

           在行级锁中,InnoDB使用一种称为next-key locking的算法。当检索表的一个索引的时候,它对遇到的索引记录加SX锁。因此行级锁实际上是索引记录锁。

           InnoDB在索引记录上加锁的时候也影响了索引记录前的‘gap’。如果一个用户拥有索引上某个记录RSX锁,另一个用户不能马上在记录R前插入一个新的索引记录。这样就可以避免幻象的出现。

     

    多版本的实现

           为了实现多版本,InnoDB必须在表空间中保存行的旧版本信息。这些信息被保存在回滚段中。

           在内部,InnoDB为每个行增加了两个域,一个6-byte的域来指示最后插入或更新这个行的事务标识符,删除标志也被认为是一个更新,因为它在提交前只是在行上做了一个标记。另外一个7-byte的域被称为回滚指针(roll pointer),回滚指针指向一个由回滚段写入的undo日志记录。如果一个行被更新了,undo日志记录包含了重建这行更新前信息的一些必要数据。

           InnoDB使用回滚段的信息来执行事务回滚所必须的一些undo操作,而且也使用这些信息来重建更新前的行信息。

           回滚段中的undo日志被分为插入日志和更新日志。插入日志仅在事务回滚的时候有用,事务提交之后就可以马上删除掉。更新日志在一致性读的时候需要使用,但是,如果当前没有事务再可能使用回滚段中的记录的时候,这些记录就可以删除掉了。因此,你必须经常提交你的事务,就算这些事务只是进行一致性读操作而已。否则,InnoDB不能删除掉某些更新日志,这样回滚段将变得越来越大。

           回滚段中undo日志记录的物理大小要比其对应的插入或更新的行要小很多。

    在多版本方式下,当你使用SQL语句删除某一行的时候,该行并不会马上从数据库的物理文件上移除。只有当InnoDB能够删除掉更新日志记录的时候,那些行及其对应的索引记录才会真正从物理上删除掉。这个移除操作称为purge

     

     

     

     

     

     

    整理自网络

    -------------------------------------------------------------------------------------------------------

    Blog http://blog.csdn.net/tianlesoftware

    Email: dvd.dba@gmail.com

    DBA1 群:62697716();   DBA2 群:62697977()   DBA3 群:62697850()  

    DBA 超级群:63306533();  DBA4 群: 83829929  DBA5群: 142216823   

    聊天 群:40132017   聊天2群:69087192

    --加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

    道森Oracle,国内最早、最大的网络语音培训机构,我们提供专业、优质的Oracle技术培训和服务! 我们的官方网站:http://www.daosenoracle.com 官方淘宝店:http://daosenpx.taobao.com/
  • 相关阅读:
    SVN相关
    Sublime text 2/3 中 Package Control 的安装与使用方法
    JavaScript 限制input输入类型(多种方法实现)
    yahoo的30条优化规则
    浏览器页面加载解析渲染机制(一)
    Cookies 和 Session的区别
    Post Get 区别
    Vue 学习之 关键字、关键单词
    移动H5前端性能优化指南
    『Python基础练习题』day01
  • 原文地址:https://www.cnblogs.com/tianlesoftware/p/3609683.html
Copyright © 2011-2022 走看看