我有一个简单的SELECT * From tv Where Client = 'ABCD'
查询,当我执行EXPLAIN EXTENDED
时,它会给我两个不同的结果。执行查询时,其中一个需要几毫秒,而另一个需要大约3秒。为什么它会给出两个不同的解释结果以及导致缓慢的原因?
慢查询:
快速查询:
答案 0 :(得分:7)
问为什么同样的查询会生成2个不同的MySQL解释结果?
A 因为有些不同。如果不在查询中,则在两个表或数据库实例之间。
所有这些都应该进行审核,以找出差异:
SHOW VARIABLES LIKE '%version%'
)SHOW [GLOBAL] VARIABLES LIKE 'character_set%'
)SHOW CREATE TABLE
)SHOW CREATE TABLE
)SHOW CREATE TABLE
)答案 1 :(得分:4)
我通过更新表统计信息解决了问题。
在MySQL上我做了:
OPTIMIZE TABLE [tablename]
答案 2 :(得分:1)
估计行数也不同。
因此MySQL使用表统计信息来确定我们的索引以及如何使用它们。由于表中的行似乎有不同的行数,因此查询计划会因统计信息不同而有所不同。
更新:
我没有正确读取行列。因此我假设行存在巨大差异。不是这种情况。似乎统计信息可能会在查询速度较慢的表格上过时。请在慢查询表上运行OPTIMIZE TABLE语句。这基本上会重建表格。
答案 3 :(得分:0)
慢速查询将类型显示为ref
,而快速查询则将类型显示为range
。我怀疑你在慢速表上的客户行上缺少一个索引。
答案 4 :(得分:0)
我可以证实这种行为。花了一整天才得到它。有时,当您不使用语句PRIMARY = PRIMARY(例如,仅使用复合主键的一部分)时,Mysql(相应的MariaDB)正在对具有大量数据的DB执行 MUCH 更快的查询(生产DB),而不是只有样本数据的DB(生产环境)
我的解决方案是复制prod的一部分。数据到开发数据库 - 它使用不同的策略执行一些查询,当然,更快。