我有一个脚本试图从表中读取所有行:
select count(*) from table where col1 = 'Y' or col1 is null;
col1和col2未编入索引,此查询通常需要约20秒,但如果某人已经在运行此查询,则需要很长时间并被阻止。
我们在表中只有大约10万行,并且在没有where子句的情况下尝试了它,它会导致同样的问题。
该表使用InnoDB,因此它不存储确切的计数,但我很好奇是否有任何并发参数我应该查看。我不确定桌子上是否缺少索引会导致问题,但对我来说没有意义。
谢谢!
答案 0 :(得分:1)
如果它们未编入索引,则需要读取表的整个磁盘文件以查找数据。单个硬盘无法执行非常好的并发读取密集型操作。你必须索引。
答案 1 :(得分:0)
您的SELECT COUNT(*)...
查询似乎与您桌面上的其他操作序列化。除非你告诉MySQL服务器,否则你的查询将尽力做到非常精确。
请在查询之前立即发出此命令,尝试更改transaction isolation level。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
设置此项可启用所谓的脏读,这意味着您可能无法计算表中操作期间发生更改的所有内容。但这可能不会太糟糕地破坏你的应用程序。
(添加适当的索引总是一个好主意,但不是你问的问题的原因。)