MySQL EXPLAIN - 它每次都给我不同的解释

标签 mysql sql query-optimization explain

我有一个非常大、复杂的查询,我正在尝试使用 MySQL EXPLAIN SELECTEXPLAIN EXTENDED SELECT 进行优化。

如果我针对查询运行它,我会看到查询中的每个表都在 Extra 列中使用 Using where,这很棒。

根本不会更改任何数据,我会去泡杯茶什么的,回来重新运行 EXPLAIN

这一次,仅仅几分钟后,只有 20% 的表是 Using where,主表现在是 Using index;使用临时的;使用 filesort,我的一天变成了试图调试它的噩梦。

我知道有时像临时表和文件排序这样的东西比使用 where 子句和索引更有效。但对于这个大小为 10GB 的数据库,创建临时表和文件排序会完全杀死服务器。

知道为什么会发生这种情况吗?这样的事情背后有逻辑或原因吗?!

最佳答案

您正在使用 InnoDB,对吗?您使用的是 5.6.6 之前的版本,对吗?

您遇到了一个关于 InnoDB 缺乏“持久统计”的有趣变体。用于触发重新计算 InnoDB 表的统计信息的几件事。这些统计信息用于决定如何执行查询。

可能您的特定查询“悬而未决”——某些统计数据的微小变化会导致不同的查询计划。

如果您愿意,我们可以深入挖掘。但我们需要看到

  • 显示创建表
  • SHOW TABLE STATUS(表格大小的线索)
  • EXPLAIN EXTENDED SELECT...
  • EXPLAIN FORMAT=JSON SELECT...(5.6.5 或更高版本)

而且我们可能会建议加快查询速度的方法。

关于MySQL EXPLAIN - 它每次都给我不同的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29276775/

相关文章:

c# - c#中是否有类似SQL IN语句的比较运算符

sql - 需要一些帮助来优化复杂的 SQL 查询

sql - 如何在 SQL (postgres) 中按年份找到与最大资源相关的项目 ID?

sql - 在 Teradata 中使用 COLLECT STATISTICS

mysql - 相关产品方法建议,MySQL InnoDB/PHP

python MySQLDb 插入准备好的语句

java - 在专业 java 应用程序中哪个是首选 jSTL 中的 SQL 或仅在 servlet 中

c# - 在 Visual Studio 2015 中使用 ADO.NET 和 MySQL

php - 是否可以在 php for 循环中使用 LAST_INSERT_ID() ?

php - 从sql中的php输入中排序日期?