mysql怎么查原理 mysql怎么查询( 三 )


在我们的测试表t_book中,test_index即为二级索引,由于我们把除了主键id所有的列都作为一个联合索引,所以在这个表上的查询都可以使用索引覆盖技术,但是具体生产环境中也不建议总是采用这种做法,索引列的增加也会增大插入更新数据时的索引更新成本,具体的优化要视具体情况决策 。t_book上的二级索引test_index的索引结构由下图表示 。
通过以上结构,我们可以推断出二级索引的以下关键特点:
索引覆盖:
最左前缀匹配:
二级索引可以说是我们在Mysql中最常用的索引,通过理解二级索引的索引结构可以更容易理解二级索引的特性和使用 。
最后聊点轻松的索引结构,哈希索引就是通过哈希表实现的索引,即通过被索引的列计算出哈希值,并指向被索引的记录 。
哈希索引有如下特性:
Mysql索引原理及慢查询优化
高性能Mysql 第三版
MySQL5.7 MVCC原理分析与调试简介:
大家好,我是xp,我又诈尸了
mvcc,想必大家都不陌生,每个Java程序员都或多或少的了解过 , 不过不知道大家都是怎么学习的 , 是不是简单的百度一下呢?下面 , 我来带大家装个13,调试 mvcc。咳,不是源码哈,但有那味了 。
开卷开卷 。
首先介绍一下 mvcc 的字面意思,全称: Multiversion Concurrency Control,翻译下来就是多版本并发控制技术 。
【mysql怎么查原理 mysql怎么查询】 脏读、 不可重复读 、幻读的概念就不多啰嗦了,mvcc具体的含义也不多啰嗦了,可以自行百度 。mvcc 解决了脏读、 不可重复读、部分幻读 ,包含了3个重要成分:
undo log作用:
在数据修改的时候 , 不仅记录了redo log,还记录了undo log。但是 不同于redo log,undo log 是逻辑日志 。简单理解成,delete的时候,undo log会出现一条insert,update的时候 , undo log会出现一条旧数据,用来事务失败之后的回滚 。
3个隐式字段:
Read View:
好了,理论讲完了,让我们嗨起来 。
嗨之前,有一个情况单独说一下:
可以看到 , 此时的trx_id非常大,这是因为此时是只读事务 。对于只读事务, InnoDB 并不会分配 trx_id,只有发生dml才会分配 。这样有2个好处:
当commit了之后,我们使用SHOW ENGINE INNODB STATUS查看:
可以看到 , 显示该事务并没有开始 。
好,回到正轨,相信大家都知道 ,  视图可见性判断(不知道的先百度mvcc):
整体是这样的:
第一步我们以 38488 为开始值,把 name 更新成 111,并且 commit
第二步以 38490 把 name 更新成 222,333 ,但是不 commit
当 38490 第一次修改为 222 的时候,数据结构大致是这样的:
使用 SHOW ENGINE INNODB STATUS 侧面验证:
当 38490 第二次修改为 333 的时候,数据结构大致是这样的:
使用 SHOW ENGINE INNODB STATUS 侧面验证:
第三步以 38491 去查询,此时生成的 m_ids 应该是 [348490,38491]
使用 SHOW ENGINE INNODB STATUS 侧面验证:
此时 ReadView 的几个属性值为:
接下来我们来验证结论:
1:不用验证,当前事务修改的肯定自己可见
2: 38491查询id=1的记录,name为111
38488348490 , 所以111可见
3:不用验证,38492是下个事务的id,还没生成呢 , 当前事务,肯定看不见下个事务修改的值
4:我们先把38491commit,把id为20的name更新成111
然后再开一个事务38496:
此时查id为20,是可见的
m_ids:[348490,38496] , 因为38491已经commit了,所以m_ids没有 。此时的38491在m_ids之间,但是在m_ids里面找不到,所以可见 。

推荐阅读