3

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

慢查询:

慢查询

快速查询:

快速查询

4

5 回答 5

9

Q为什么同一个查询会产生 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 缓冲区在两台服务器上的大小是否相同?
于 2013-08-13T23:12:43.907 回答
6

我通过更新表统计信息解决了。

在 MySQL 上我做了:

OPTIMIZE TABLE [tablename]
于 2015-05-18T19:08:09.993 回答
1

那么估计的行数也不同。

所以 MySQL 使用表统计信息来确定我们需要哪些索引以及如何使用它们。由于表中似乎有不同数量的行,因此查询计划会有所不同是合理的,因为统计信息会有所不同。

更新:

我没有正确阅读行列。因此,我假设行数存在巨大差异。不是这种情况。似乎使用慢查询的表上的统计信息可能已过时。请在慢查询表上运行 OPTIMIZE TABLE 语句。这将基本上重建表。

于 2013-08-13T21:49:30.543 回答
0

慢查询将类型显示为 ,ref而快速查询将类型显示为range。我怀疑您在慢表上的客户端行上缺少索引。

于 2013-08-13T22:24:32.193 回答
-1

我可以确认这种行为。只是花了一整天的时间才得到它。有时,当您不使用语句 PRIMARY = PRIMARY (例如,仅使用复合主键的一部分)时,Mysql(或 MariaDB)正在使用大量数据(生产 DB)而不是 DB 对 DB 执行更快的查询仅使用示例数据(生产环境)

我的解决方案是复制部分产品。数据到开发数据库 - 它使用不同的策略执行了一些查询,当然,速度更快。

于 2014-03-10T20:15:22.260 回答