关于count(*)和联表查询和锁表的问题

MySql 码拜 8年前 (2016-02-20) 2813次浏览
刚开始学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同时插入数据,coun用时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协议进行授权 , 转载请注明关于count(*)和联表查询和锁表的问题
喜欢 (1)
[1034331897@qq.com]
分享 (0)