在向MySQL DB发出SELECT COUNT(*)
查询时,我们始终执行EXPLAIN
查询并将其结果记录下来以进行调试。
我们的一些查询包含一个带有长列表值的IN
子句(对于索引列,可能是100K +)。相关表包含~3M行,这些查询中没有连接。
所以,我发出了一对查询:
SELECT COUNT(*) FROM myTable WHERE col0 IN (v0,v1,...,v100000)
EXPLAIN SELECT COUNT(*) FROM myTable WHERE col0 IN (v0,v1,...,v100000)
col0
是varchar(100)
的索引列。
现在,在从MySQL 5.5.33升级到5.7.12之后,我发现虽然SELECT COUNT
查询本身的工作方式相同,但EXPLAIN
查询需要很长时间(约45秒) 。对于100K值的列表,看起来增长是指数的)。在版本5.5中,它像所有其他EXPLAIN
查询一样立即生效。
我在最新版本的MySQL的发行说明中找不到任何相关信息。
有谁知道:(1)由于某种原因,它是(已知的)错误还是预期的行为; (2)有没有办法通过配置标志等解决它?
提前致谢!
在这两个版本中,我们对标准my.cnf
的唯一补充是:
innodb_buffer_pool_size = 6G
max_allowed_packet = 104857600 #to make such queries possible from the beginning
在5.7版中,我还添加了这个:
#Remove the 'ONLY_FULL_GROUP_BY','STRICT_TRANS_TABLES' modes from the list of SQL modes.
sql-mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"