为什么同样的查询产生2个不同的MySQL解释结果?

时间:2013-08-13 19:56:40

标签: mysql explain

我有一个简单的SELECT * From tv Where Client = 'ABCD'查询,当我执行EXPLAIN EXTENDED时,它会给我两个不同的结果。执行查询时,其中一个需要几毫秒,而另一个需要大约3秒。为什么它会给出两个不同的解释结果以及导致缓慢的原因?

慢查询:

Slow Query

快速查询:

Fast Query

5 个答案:

答案 0 :(得分:7)

为什么同样的查询会生成2个不同的MySQL解释结果?

A 因为有些不同。如果不在查询中,则在两个表或数据库实例之间。

所有这些都应该进行审核,以找出差异:

  • 它们是否运行在相同版本的MySQL(SHOW VARIABLES LIKE '%version%'
  • 实例是否运行相同的字符集(SHOW [GLOBAL] VARIABLES LIKE 'character_set%'
  • 表格列是否使用相同的字符集(SHOW CREATE TABLE
  • 两个表都使用相同的存储引擎吗? (SHOW CREATE TABLE
  • 如果主键是复合键,则列的顺序是相同的(SHOW CREATE TABLE
  • 统计数据是最新且准确的吗?
  • 由于大量的插入,更新,删除活动,其中一个表是否已碎片化?
  • 两台服务器上的MyISAM密钥缓存或InnoDB缓冲区是否相同?

答案 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的一部分。数据到开发数据库 - 它使用不同的策略执行一些查询,当然,更快。