MySQL的InnoDB引擎什么时候会失去行锁效果(MySql索引失效)

最近面试别别人的时候提了一个问题:MySQL的InnoDB引擎什么时候会失去行锁效果

发现很多人答不上来,于是我重新问了个问题:MySql索引什么时候会失效。发现基本上都能答。

其实我问这个问题的重点就在于想了解面试者是只背了八股文,还是有综合性的学习MySql

MySql行锁锁的是什么?

MySQL的行锁是基于索引实现的,也就是说,锁住的是索引记录,而不是数据记录。

MySQL的行锁类型

MySQL的行锁有多种类型,如记录锁、间隙锁、临键锁、Next-Key锁等。

记录锁(Record Lock)是指对索引记录加上一个锁标记,表示该记录被某个事务占用。记录锁可以是共享锁(S Lock)或排他锁(X Lock)。

间隙锁(Gap Lock)是指对索引记录之间的间隙加上一个锁标记,表示该间隙内不能插入新的记录。间隙锁可以防止幻读(Phantom Read)的发生。

临键锁(Insert Intention Lock)是指对索引记录之前的间隙加上一个特殊的间隙锁,表示该间隙内可以插入新的记录,但不影响其他事务对该间隙的访问。临键锁可以提高并发插入的性能。

Next-Key锁(Next-Key Lock)是指记录锁和间隙锁的组合,表示对索引记录及其之前的间隙加上一个锁标记,表示该记录和该间隙都被某个事务占用。Next-Key锁是MySQL中最常用的行锁类型。

从底层来看,MySQL的行锁是通过在索引页中添加一个位图来实现的,每个位代表一个索引槽(Slot),如果该位为1,则表示该槽被加了锁,否则为0。

当一个事务要对一个索引记录加锁时,它会先计算出该记录所在的槽号,然后检查该槽对应的位是否为1,如果为1,则表示该记录已经被其他事务加了锁,那么当前事务就会等待或者返回错误;如果为0,则表示该记录没有被加锁,那么当前事务就会将该位设置为1,并继续执行。

当一个事务要释放一个索引记录的锁时,它会先计算出该记录所在的槽号,然后将该槽对应的位设置为0,并通知其他等待该记录的事务。

MySQL的InnoDB引擎什么时候会失去行锁效果

有了前缀知识的了解,那么回答这个问题就相对简单了:只需要就是MySQL索引什么时候失效就可以了。

MySQL索引什么时候会失效呢?

隐式或显式类型转换

对索引字段的数据进 过滤时,如果有隐式数据类型转换会造成索引失效。

下 的例 中, name 是字符串类型,123是整数类型,这时MySQL会尝试将 name 字段中

的值转成数字类型,这会引起索引失效:

对索引字段进行运算

在过滤条件中,对索引字段做任何运算都会造成索引失效

like左模糊查询

使 like 对字符串做左模糊查询时会造成索引失效:

补充:右模糊查询可以使 索引,相当于是 个范围查询:

or连接 索引字段条件

如果查询条件中有or,即使其中有部分条件带索引也不会使用,除非or条件中的每个列都加上索引。

最左前缀原则

在使用多个字段组合的索引时,最好的情况是所有索引字段条件都同时出现。

最左前缀原则就是针对多字段组合索引的,它指的是,多字段组合索引中第 个字段条件必须出现索引才能 效,否则索引会失效。另外,索引字段条件必须是连续的,跳过中间字段,后 字段的条件会失效。

下 例 中要创建 个 banji_id, age, name 三个字段的组合索引, name 字段的索引暂时不使用。

drop index idx_name
on xuesheng;

创建 banji_id , age , name 三个字段的组合索引:

create index idx_banji_age_name
on xuesheng(banji_id,age,name);

1.对于组合索引,最好的情况是所有索引字段条件都出现:

补充:key_len 字段的含义是,三个字段的字段类型,字节量总数是90字节。

三个条件的顺序 所谓,把条件打乱顺序结果也是 样的:

2.如果缺少第 个字段条件,即 banji_id 字段的条件,那么索引会失效:

补充:

是要有第 个字段的条件,即使缺少后 字段的条件索引也可以 效:

key_len 字段的值是5,这是 banji_id 这 个字段的字节量 。

3.如果跳过中间的 age 字段,使 banji_id 和 name 字段条件,那么跳过的 age 字段后 的 name 条件索引会失效

key_len 的值是5,这只是 banji_id 这 个字段的字节量 ,说明 name 字段索引失效。

4. 较运算后 的索引条件失效

使 多字段组合索引时,中间字段如果使 较运算,后 字段的索引会失效:

key_len 的值是7,这是 banji_id 和 age 两个字段的字节量, name 字段的索引失效。

最后补充:

如果查询或更新操作涉及到多个表,并且满足以下条件,那么会使用行锁:

否则,可能会使用表锁或者混合使用行锁和表锁。

展开阅读全文

页面更新:2024-03-12

标签:多字   索引   组合   前缀   字段   间隙   字节   条件   效果   事务   类型   引擎

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top