2009-07-28 96 views
0

据有关Optimizing Queries With Explain MySQL文档:上优化MySQL查询:是否总是可以优化查询,以便它不使用“ALL”

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

这是否意味着使用所有任何查询可以进行优化,使其不再是做一个全表扫描?

换句话说,通过在表中添加正确的索引,是否有可能总是避免使用ALL?或者是否存在一些无法避免ALL的情况,无论您添加了哪些索引?

+0

如果需要,您如何检索所有列?通过使用*(ALL)或分别命名每个列。不会改变一件事。 – dusoft 2009-07-28 19:56:17

回答

2

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

1

是的,有一些查询会难以产生适当的索引。例如:

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

我不完全知道为什么你会想做出这样的查询,虽然:)

这就是说,过多的索引会占用更多的缓存内存和磁盘空间,并放慢更新和插入。