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