对于并发查询,MySql count(*)超级慢

时间:2017-07-06 22:33:47

标签: mysql sql database

我有一个脚本试图从表中读取所有行:

select count(*) from table where col1 = 'Y' or col1 is null;

col1和col2未编入索引,此查询通常需要约20秒,但如果某人已经在运行此查询,则需要很长时间并被阻止。

我们在表中只有大约10万行,并且在没有where子句的情况下尝试了它,它会导致同样的问题。

该表使用InnoDB,因此它不存储确切的计数,但我很好奇是否有任何并发​​参数我应该查看。我不确定桌子上是否缺少索引会导致问题,但对我来说没有意义。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果它们未编入索引,则需要读取表的整个磁盘文件以查找数据。单个硬盘无法执行非常好的并发读取密集型操作。你必须索引。

答案 1 :(得分:0)

您的SELECT COUNT(*)...查询似乎与您桌面上的其他操作序列化。除非你告诉MySQL服务器,否则你的查询将尽力做到非常精确。

请在查询之前立即发出此命令,尝试更改transaction isolation level

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

设置此项可启用所谓的脏读,这意味着您可能无法计算表中操作期间发生更改的所有内容。但这可能不会太糟糕地破坏你的应用程序。

(添加适当的索引总是一个好主意,但不是你问的问题的原因。)