刚开始学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次读取的数据是一样的。
完全执行完语句后,才会解锁,这里不是说读取完数据,就解锁,因为这个语句执行的过程是动态的