开发者学堂课程【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 OK
,1 row affected(0.00sec)
Rows matched :1 Changed :1 Warnings :0
mysq1>commit;
Query OK
,1 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 OK
,1 row affected(0.00 sec )
Rows matched :1 Changed :1 Warnings :0
于 session-1输入【show index from test_ innodb_1ock;
】分别为a、b建立共两个索引
索引失效后,性能会下降,甚至于行锁变表锁
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 OK
,1 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 )