mysql中count和联表查询和锁表的问题

MySql 码拜 9年前 (2015-10-11) 3025次浏览
刚开始学MySQL,在描述时候如果有不对的地方,希望各位高手指出。

本人在看书的时候看到了这么一句,在生产环境中请不要随意使用count(*),因为它将会进行表级锁定(inno DB下)。

因为最近在做数据统计,所以想到了一个问题,假设有如下一条SQL语句。

select count(b.id) from a,b where a.id = b.id;

根据执行顺序,先从from语句开始,a表与b表在内存中产生一张虚拟表VT1,那么之后的count操作应该就是在VT1上进行了,这个时候表A或者表B会被进行锁定吗?

假设在这个过程中没有锁定,问一下是在何时解锁的?VT1产生的时候?

假设这个过程中仍然被锁定,问一下是否在SQL语句结束后才会产生解锁?

如果有描述不清或者本人理解错误的地方,希望指出,谢谢

解决方案:10分
用count会有表级的锁?本人刚试过了, 在count同时插入数据,count用时3秒多,insert也成功了。
解决方案:10分
LZ可以简单做个测试 

开启两个事务

第一个事务 先begin事务,利用count(*)进行查询

第二个事务 在 第一个事务不commit的情况下进行insert操作

经过测试的回答才是最有用的

解决方案:80分
根据执行顺序,先从from语句开始,a表与b表在内存中产生一张虚拟表VT1,那么之后的count操作应该就是在VT1上进行了,这个时候表A或者表B会被进行锁定吗?

这个书上写的也没错,但是有个前提条件,就是隔离级别,在mysql中默认是 repeatable read,也就是可以重复读,也就是在一个事务中,2次读取的数据是一样的。

完全执行完语句后,才会解锁,这里不是说读取完数据,就解锁,因为这个语句执行的过程是动态的


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明mysql中count和联表查询和锁表的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)