无索引时行锁升级为表锁测试
2016-01-14 15:45
246 查看
今天看到简朝阳的书上的一句话,如下:
当Query无法利用索引的时候,Innodb会放弃使用行级别锁定而改用表级别锁定,造成并发效率的降低。
看到这句话,开始让我有种不信的感觉,所以亲自测试下,MYSQL版本为5.5,
过程如下:
表中的a b都是无索引的
![](http://img.blog.csdn.net/20160114155440239?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
开启两个事务,事务A进行更新,之后事务B也进行更新,但是更新的是不同的两行。结果如下
![](http://img.blog.csdn.net/20160114155604797?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
执行B的更新
![](http://img.blog.csdn.net/20160114155613829?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我们看到B事务此时阻塞,结果和书上说的一样,有些吃惊,这么说写操作一定要注意where条件了,一定要使用索引来避免全表锁定。
因为Innodb是基于索引来实现行锁的,如果不存在索引,那么就不能对此行加record lock,而mysql为了防止错误,只好全部锁定了。
当Query无法利用索引的时候,Innodb会放弃使用行级别锁定而改用表级别锁定,造成并发效率的降低。
看到这句话,开始让我有种不信的感觉,所以亲自测试下,MYSQL版本为5.5,
过程如下:
表中的a b都是无索引的
开启两个事务,事务A进行更新,之后事务B也进行更新,但是更新的是不同的两行。结果如下
执行B的更新
我们看到B事务此时阻塞,结果和书上说的一样,有些吃惊,这么说写操作一定要注意where条件了,一定要使用索引来避免全表锁定。
因为Innodb是基于索引来实现行锁的,如果不存在索引,那么就不能对此行加record lock,而mysql为了防止错误,只好全部锁定了。
相关文章推荐
- Swift - 使用NSURL进行数据的提交和获取(POST与GET)
- nc获取系统当前时间
- IOS #define和预编译指令
- linux文件操作学习3
- Sharepoint 2013 搭建域控服务器
- 巧用内存断点破解二元函数加密
- 交流小记
- spring3.2 spring-servlet.xml 配置
- 常见的Tomcat问题以及异常
- docker的启动和停止以及挂载目录的更换操作
- iOSPush原理及实现
- 深入理解express的中间件
- HTML/CSS中,DIV高度自适应的解决方法
- LB 集群之 LVS
- HeartBeat 配置文件详解
- maven eclipse web项目流程(简化内容)
- 2015 小结及其2016计划
- 通过Mysql-bin日志恢复还原数据
- 《你的知识需要管理》读书笔记
- 在eclipse开发工具中使用JUnit4进行单元测试详解(四)常用元数据