【问题标题】:How does optimize command change the explain优化命令如何改变解释
【发布时间】:2018-03-09 15:29:33
【问题描述】:

我想问一个关于数据库索引和优化原理的问题。

我正在使用 mysql。模式引擎是 myisam。在一个查询中,解释结果显示一个表中有 8000+ 行,这些行已经被很好地索引了。然后我的同事在这个表中使用了命令“优化表”。之后,解释显示了 2 行看起来正确的行。结果很好,但我们俩都不太明白到底发生了什么以及为什么。

我是这个领域的新手。那么任何人都可以帮助解释这个“解释”和优化后索引如何显着改变?在我们优化表格之前,我认为索引应该足够好。

非常感谢!

【问题讨论】:

  • InnoDB 做得更好。出于这个原因以及许多其他原因,您应该迁移到 InnoDB。

标签: mysql indexing sql-execution-plan explain


【解决方案1】:

您可以在此处阅读有关 OPTIMIZE TABLE 的手册:https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html

对于 MyISAM 表,OPTIMIZE TABLE 的工作方式如下:

  1. 如果表已删除或拆分行,请修复表。

  2. 如果索引页面未排序,则对其进行排序。

  3. 如果表的统计信息不是最新的(并且修复可能 不能通过排序索引来完成),更新它们。

这是对您的情况最有用的最后一步。这与 ANALYZE TABLE 执行的工作相同。在此处阅读有关其作用的更多信息:https://dev.mysql.com/doc/refman/5.7/en/analyze-table.html

在使用 InnoDB 时,OPTIMIZE TABLE 和 ANALYZE TABLE 做的事情完全不同。阅读文档以了解更多信息。

【讨论】:

    【解决方案2】:

    这一切都与索引中的“数据分布”有关。随着时间的推移和记录的增加,一个索引可能会变得比另一个更适合。你显然需要一个例子:

    假设您有一个表,其中包含 last_namecity 字段以及每个字段的索引。如果您使用两个字段进行搜索,例如WHERE last_name='jones' and city='here',那么任何索引可能都可以使用,它们都是相等的。一旦选择了一个,就会对第二个字段进行慢速搜索。

    现在随着时间的推移,city 可能会开始显示出比名称少得多的可变性。因此,对两者的搜索可能表明 city 将产生太多记录以作为第二遍过滤,而 last_name 可能是一个较小的集合,因此速度更快。

    Optimize 将检测此分布并提示使用 last_name 而非 city 以获取更多数据和时间。

    希望这很清楚......

    【讨论】:

      猜你喜欢
      • 2021-11-21
      • 2023-02-14
      • 1970-01-01
      • 2020-12-10
      • 2013-08-26
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多