聚簇索引

惊!史上最全的select加锁分析(Mysql)

狂风中的少年 提交于 2019-11-26 16:12:06
引言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * from table where id < ? select * from table where id = ? lock in share mode select * from table where id < ? lock in share mode select * from table where id = ? for update select * from table where id < ? for update 如果你能清楚的说出,这六句sql在不同的事务隔离级别下,是否加锁,加的是共享锁还是排他锁,是否存在间隙锁,那这篇文章就没有看的意义了。 之所以写这篇文章是因为目前为止网上这方面的文章太片面,都只说了一半,且大多没指明隔离级别,以及 where 后跟的是否为索引条件列。在此,我就不一一列举那些有误的文章了,大家可以自行百度一下,大多都是讲不清楚。 OK,要回答这个问题,先问自己三个问题 当前事务隔离级别是什么 id列是否存在索引 如果存在索引是聚簇索引还是非聚簇索引呢? OK,开始回答 正文 innodb一定存在聚簇索引,默认以主键作为聚簇索引 有几个索引,就有几棵B+树(不考虑hash索引的情形)

【转】史上最全的select加锁分析(Mysql)

我只是一个虾纸丫 提交于 2019-11-26 12:28:46
引言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * from table where id < ? select * from table where id = ? lock in share mode select * from table where id < ? lock in share mode select * from table where id = ? for update select * from table where id < ? for update 如果你能清楚的说出,这六句sql在不同的事务隔离级别下,是否加锁,加的是共享锁还是排他锁,是否存在间隙锁,那这篇文章就没有看的意义了。 之所以写这篇文章是因为目前为止网上这方面的文章太片面,都只说了一半,且大多没指明隔离级别,以及 where 后跟的是否为索引条件列。在此,我就不一一列举那些有误的文章了,大家可以自行百度一下,大多都是讲不清楚。 OK,要回答这个问题,先问自己三个问题 当前事务隔离级别是什么 id列是否存在索引 如果存在索引是聚簇索引还是非聚簇索引呢? OK,开始回答 正文 本文假定读者,看过我的 《MySQL(Innodb)索引的原理》 。如果没看过,额,你记得三句话吧 innodb一定存在聚簇索引

阿里系统研发部数据库组教你一文搞懂 MySQL 单表查询的底层实现

旧巷老猫 提交于 2019-11-25 20:48:52
对于我们这些 MySQL的使用者来说,平时用的最多的就是查询功能。DBA时不时丢过来一些慢查询语句让优化,如果连查询是怎么执行的都不清楚还优化个毛线,所以是时候掌握真正的技术了。 MySQL有一个称为 查询优化器的模块,一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个所谓的 执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。不过查询优化这个主题有点儿大,在学会跑之前还得先学会走,所以本章先来瞅瞅 MySQL怎么执行单表查询(就是 FROM子句后边只有一个表,最简单的那种查询~)。 为了故事的发展,先得有个表: 我们为这个 single_table表建立了1个聚簇索引和4个二级索引,分别是: 为 id列建立的聚簇索引。 为 key1列建立的 idx_key1二级索引。 为 key2列建立的 idx_key2二级索引,而且该索引是唯一二级索引。 为 key3列建立的 idx_key3二级索引。 为 key_part1、 key_part2、 key_part3列建立的 idx_key_part二级索引,这也是一个联合索引。 然后我们需要为这个表插入10000行记录,除 id列外其余的列都插入随机值就好了,具体的插入语句我就不写了

阿里系统研发部数据库组教你一文搞懂 MySQL 单表查询的底层实现

那年仲夏 提交于 2019-11-25 20:48:46
对于我们这些 MySQL的使用者来说,平时用的最多的就是查询功能。DBA时不时丢过来一些慢查询语句让优化,如果连查询是怎么执行的都不清楚还优化个毛线,所以是时候掌握真正的技术了。 MySQL有一个称为 查询优化器的模块,一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个所谓的 执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。不过查询优化这个主题有点儿大,在学会跑之前还得先学会走,所以本章先来瞅瞅 MySQL怎么执行单表查询(就是 FROM子句后边只有一个表,最简单的那种查询~)。 为了故事的发展,先得有个表: 我们为这个 single_table表建立了1个聚簇索引和4个二级索引,分别是: 为 id列建立的聚簇索引。 为 key1列建立的 idx_key1二级索引。 为 key2列建立的 idx_key2二级索引,而且该索引是唯一二级索引。 为 key3列建立的 idx_key3二级索引。 为 key_part1、 key_part2、 key_part3列建立的 idx_key_part二级索引,这也是一个联合索引。 然后我们需要为这个表插入10000行记录,除 id列外其余的列都插入随机值就好了,具体的插入语句我就不写了