索引失效行锁变表锁|学习笔记

简介: 快速学习索引失效行锁变表锁

开发者学堂课程【MySQL 高级应用 - 索引和锁索引失效行锁变表锁】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/598/detail/8636


索引失效行锁变表锁


一、无索引行锁升级为表锁

索引建立后若使用不当会导致行锁升级为表锁,其打击面十分巨大。

由于添加的为行锁,如若 session-1首先改变4号记录,session-2再次改变4号记录将会造成堵塞。

如若 session-2改变9号记录,则两者互不相干。

session-1

mysq1>update test_innodb_lock set b=' 4000' where a=4

Query OK1 row affected(0.00sec)

Rows matched :1 Changed :1 Warnings :0

mysq1>commit;

Query OK1 row affected(0.01sec)

mysq1>select* feom test_innodb_lock;  

//进行 select

+------+--------+

|  a   | b     |

+------+--------+

|   1  | b2    |

|   3  | 3     |

|   4  | 4000  |      //4号记录恢复回复成功

|   5  | 5000  |    

|   6  | 6000  |

|   7  | 7000  |

|   8  | 8000  |

|   9  | 9000  |     //9号记录恢复成功

|   1  | b1    |

+------+--------+

9 rows in set (0.00 sec )

session-2

mysq1>update test_innodb_lock set b=' 9000' where a=9

Query OK1 row affected(0.00 sec )

Rows matched :1 Changed :1 Warnings :0

session-1输入【show index from test_ innodb_1ock】分别为ab建立共两个索引

索引失效后,性能会下降,甚至于行锁变表锁

Session-1中更改【set a=41 where b= ‘4000】,session-2中更改【set b=’9001’ where a=9】,此时 b

此时行锁无任何问题,但自动类型转化必须加【】,否则可能会出如 session-2的表锁情况。此种情况的故障十分隐蔽。

更改

session-1

mysq1>update test_innodb_lock set a=4 where b='4000'

mysq1>commit;

Query OK1 row affected(0.01sec)

session-2

mysq1>select* feom test_innodb_lock;

+------+--------+

|  a   | b     |

+------+--------+

|   1  | b2    |

|   3  | 3     |

|   41  | 4000 |  

|   5  | 5000  |    

|   6  | 6000  |

|   7  | 7000  |

|   8  | 8000  |

|   9  | 9000  |    

|   1  | b1    |

+------+--------+

9 rows in set (0.00 sec )

mysq1 select* feom test_innodb_lock;

+------+--------+

|  a   | b     |

+------+--------+

|   1  | b2    |

|   3  | 3     |

|   4  | 4000   |  

|   5  | 5000  |    

|   6  | 6000  |

|   7  | 7000  |

|   8  | 8000  |

|   9  | 9002  |    

|   1  | b1    |

+------+--------+

9 rows in set (0.00 sec )

相关文章
|
3天前
|
SQL 关系型数据库 MySQL
14. 什么情况下索引会失效 ?
了解 MySQL 索引失效的情况对优化 SQL 查询至关重要。避免在列上使用函数、运算、!=、not in、OR 和 %value% LIKE 操作,以保持索引有效性。使用组合索引代替多个单列索引,防止范围查询后的列无法使用索引。注意,NULL 值、列类型不匹配和隐式转换也可能导致索引失效。
19 0
|
3天前
|
SQL 关系型数据库 MySQL
索引失效的10中场景
索引失效的10中场景
|
9月前
|
存储 关系型数据库 MySQL
mysql索引失效问题
mysql索引失效问题
67 0
|
9月前
|
存储 关系型数据库 MySQL
Mysql索引失效的几种原因
Mysql索引失效的几种原因
103 0
|
9月前
|
存储 关系型数据库 MySQL
教你优雅的实现索引失效
教你优雅的实现索引失效
59 0
|
10月前
|
关系型数据库 MySQL 索引
索引失效的情况
索引失效的情况
58 0
|
10月前
|
存储 SQL 关系型数据库
Mysql索引失效情况
官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。 我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。
55 0
|
10月前
|
关系型数据库 MySQL 索引
MySQL索引失效的场景
MySQL中索引可以失效的场景有很多,下面列举一些常见的场景,并提供相应的示例代码。
61 0
|
11月前
|
SQL 关系型数据库 MySQL
详解MySQL索引失效
B+树结构 索引失效的根本原因其实就是违反了B+树的结构特性,查找的时候没办法在B+树上继续走下去,所以首先我们来回顾一下B+树的数据结构。 如果对B树、B+树不熟悉的可以看一下博主之前的文章,详细介绍了这两种数据结构:数据结构(8)树形结构——B树、B+树(含完整建树过程)_b+树构造过程__BugMan的博客-CSDN博客 B+树是一棵N叉树,遵循每个节点遵循左<根<右,然后叶节点上是一条分支上的所有数据,且为了方便范围查询,叶子节点用指针连接。
95 0
|
SQL 存储 关系型数据库
MySQL索引失效问题
MySQL索引失效问题