【问题标题】:Optimizing MySQL Queries: Is it always possible to optimize a query so that it doesn't use "ALL"优化 MySQL 查询:是否总是可以优化查询使其不使用“ALL”
【发布时间】:2010-11-14 20:17:34
【问题描述】:

根据关于Optimizing Queries With Explain的MySQL文档:

* ALL:对先前表中的每个行组合进行全表扫描。如果该表是第一个未标记为 const 的表,这通常不好,并且在所有其他情况下通常非常糟糕。 通常,您可以通过添加索引来避免 ALL,这些索引允许基于之前表中的常量值或列值从表中检索行。

这是否意味着可以优化使用 ALL 的 any 查询,使其不再进行全表扫描?

换句话说,通过向表中添加正确的索引,是否可以始终避免使用 ALL?或者在某些情况下,无论您添加什么索引,ALL 都是不可避免的?

【问题讨论】:

  • 如果需要,您将如何检索所有列?通过使用 * (ALL) 或分别命名每一列。不会改变任何事情。
  • 啊。澄清一下:假设查询试图检索 1 或 2 行,而不是整个表中的所有行。

标签: optimization mysql explain


【解决方案1】:

是的,有些查询很难生成适当的索引。例如:

SELECT * FROM mytable WHERE colA * arg0 - colB > arg1

不过,我不完全确定您为什么要进行这样的查询:)

也就是说,过多的索引会占用更多的缓存内存和磁盘空间,并且会减慢更新和插入的速度。

【讨论】:

    【解决方案2】:

    几乎(在某些情况下,进行全扫描实际上更便宜)总是可以优化 ONE 查询,以避免通过创建适当的索引来进行全扫描。但是,如果您对同一个表运行多个查询,那么在某些情况下,其中一些最终会进行全扫描,或者您最终会得到更多索引,那么您的表中有列:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 2016-04-10
      • 1970-01-01
      • 2011-12-15
      • 2016-06-11
      相关资源
      最近更新 更多