2009-07-28 98 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 

我不完全知道爲什麼你會想做出這樣的查詢,雖然:)

這就是說,過多的索引會佔用更多的緩存內存和磁盤空間,並放慢更新和插入。