mysql 之mvcc多版本控制
2016-04-05 16:40
323 查看
MVCC是multiversion concurrency control的缩写,提供MySQL事物隔离级别下无锁读,例如一个事物在执行update等修改数据的sql,并未提交时其他事物进行数据读取是不影响的,而且读取内容为数据变更之前的数据。
mvcc多本版快照由innodb的rollback segment构照的,一个sql进行查找数据当查找到某一个数据需要到回滚段中查找数据时,就会根据当前页上行数据的一个指针到回滚段中查找对应数据,在innodb的表主键中都会存在三个隐藏的字段:
DB_TRX_ID:该字段存储最后一个修改该行数据的事务ID,占用6byte的空间,MySQL的delete操作是标记删除,所以对应行数据的该字段就为一个删除标记。
DB_ROLL_PTR:该字段就记录执行roll segment的指针信息,当事务需要rollback时就通过该字段寻找记录重新构照行数据,该字段占用7byte空间。
DB_ROW_ID:记录每个行ID,该ID值为单调递增型整数,在innodb表指定了主键之后DB_ROW_ID存在于主键索引上,如果无主键无唯一索引该字段作为主键使用,占用6byte空间。
在一个sql进行查询时,读取到一行数据的DB_TRX_ID值和自己事物ID的对比,假如隔离级别为MySQL的默认级别,就只读取该ID值小于本身事物ID的数据,其余数据就需要通过DB_ROLL_PTR的信息到回滚段中读取。MVCC是否起到相应的作用需取决于数据库隔离级别的配置。
在insert和update、delete的操作是有区别的,一个insert语句插入数据再rollback就是直接对undo log的删除,因为他并不会影响其他事物的读取操作,而update、delete操作是在原有数据做更改,可能有其他事物在对该行数据做读取操作,所以update、delete产生的undo log数据是由内部线程自动清理,在该数据无任何事务在使用时清理掉,所以在undo log中insert和update、delete产生的数据存于不同位置。
上面说了数据的update、delete、insert操作,都会根据主键上的隐藏列来判断和查找,但是辅助索引并不存在隐藏列,辅助索引就是有索引列和主键列组成的一个小表,这该怎么判断呢?辅助索引区别在于假如是一个update操作步骤为:
1、标记删除原纪录
2、插入新纪录
3、对应主键做上面的隐藏字段修改,行数据更新,原行数据移入回滚段
当一个利用辅助索引查找的语句在进行扫描时,发现有标记删除记录和新插入记录就不会使用索引覆盖扫描,会返回主键扫描,5.6之后开启了ICP优化的实例依然会使用辅助索引扫描,只是对于标记删除记录和新插入记录会返回主键里面隐藏字段进行扫描。
本文出自 “肖忠” 博客,请务必保留此出处http://xiaozhong991.blog.51cto.com/2354914/1760516
mvcc多本版快照由innodb的rollback segment构照的,一个sql进行查找数据当查找到某一个数据需要到回滚段中查找数据时,就会根据当前页上行数据的一个指针到回滚段中查找对应数据,在innodb的表主键中都会存在三个隐藏的字段:
DB_TRX_ID:该字段存储最后一个修改该行数据的事务ID,占用6byte的空间,MySQL的delete操作是标记删除,所以对应行数据的该字段就为一个删除标记。
DB_ROLL_PTR:该字段就记录执行roll segment的指针信息,当事务需要rollback时就通过该字段寻找记录重新构照行数据,该字段占用7byte空间。
DB_ROW_ID:记录每个行ID,该ID值为单调递增型整数,在innodb表指定了主键之后DB_ROW_ID存在于主键索引上,如果无主键无唯一索引该字段作为主键使用,占用6byte空间。
在一个sql进行查询时,读取到一行数据的DB_TRX_ID值和自己事物ID的对比,假如隔离级别为MySQL的默认级别,就只读取该ID值小于本身事物ID的数据,其余数据就需要通过DB_ROLL_PTR的信息到回滚段中读取。MVCC是否起到相应的作用需取决于数据库隔离级别的配置。
在insert和update、delete的操作是有区别的,一个insert语句插入数据再rollback就是直接对undo log的删除,因为他并不会影响其他事物的读取操作,而update、delete操作是在原有数据做更改,可能有其他事物在对该行数据做读取操作,所以update、delete产生的undo log数据是由内部线程自动清理,在该数据无任何事务在使用时清理掉,所以在undo log中insert和update、delete产生的数据存于不同位置。
上面说了数据的update、delete、insert操作,都会根据主键上的隐藏列来判断和查找,但是辅助索引并不存在隐藏列,辅助索引就是有索引列和主键列组成的一个小表,这该怎么判断呢?辅助索引区别在于假如是一个update操作步骤为:
1、标记删除原纪录
2、插入新纪录
3、对应主键做上面的隐藏字段修改,行数据更新,原行数据移入回滚段
当一个利用辅助索引查找的语句在进行扫描时,发现有标记删除记录和新插入记录就不会使用索引覆盖扫描,会返回主键扫描,5.6之后开启了ICP优化的实例依然会使用辅助索引扫描,只是对于标记删除记录和新插入记录会返回主键里面隐藏字段进行扫描。
本文出自 “肖忠” 博客,请务必保留此出处http://xiaozhong991.blog.51cto.com/2354914/1760516
相关文章推荐
- VS2013 EF6连接MySql需要几步?
- mysql5.7版本开始创建用户需要create user
- Windows下MySQL忘记了密码怎么修改
- mysql死锁分析
- 【MYSQL 清空所有的的表中的数据的SQL的生成】
- mysql 事件
- MySQL INSERT DELAYED
- mysql 5.7.11使用dbforget Studio 连接异常
- MySQL的分页技术总结
- mysql使用binlog数据恢复
- Mysql procedure原理、语法 、实例
- mysql排序,可以对统计的数据进行排序
- MySQLBackup 使用说明
- 详解mysql备份恢复的三种实现方式
- mysql连接失败access denied for user root @localhost
- mysql skip-grant-tables 添加用户报错 ERROR 1290
- MySQL语句优化的原则
- Mysql命令大全
- 对B+树与索引在MySQL中的认识
- MYSQL卸载后重新安装最后无法start service的解决办法