2008-09-24 75 views
10

如果我有一個查詢一樣,是否索引< or > MySQL查詢?

DELETE FROM table WHERE datetime_field < '2008-01-01 00:00:00' 

不具有datetime_field列索引的幫助?即索引僅在使用相等(或不等)測試時有用,還是在進行有序比較時也很有用?

(建議更好地執行這個查詢,而無需重新創建表,也將是確定!)

回答

11

也許吧。一般來說,如果存在這樣的索引,如果查詢中沒有「更好」的索引,它將使用該索引上的範圍掃描。但是,如果優化器決定範圍最終會變得太大(即包括超過1/3的行),則它可能根本不會使用該索引,因爲表掃描可能是更快。

使用EXPLAIN(在SELECT上;你不能解釋刪除)來確定它在特定情況下的決定。這可能取決於

  • 有多少行是在表
  • 的範圍是什麼,你要指定
  • 在WHERE子句中指定什麼。如果有另一個「看起來更好」的索引,它不會使用一個索引的範圍掃描。
+2

或許,這應該是一個額外的問題,但有一個簡單的答案(或參照MySQL文檔的一部分),說明優化器是如何做出決定關於範圍太大?特定情況在WHERE中沒有別的。 – 2008-09-24 09:36:31

1

它,請與一個DESCRIBE SELECT FROM表...

2

索引在日期時間字段肯定會幫助基於日期範圍的搜索。我們一直在我們的數據庫中使用它們,並且查詢速度很慢,沒有索引。

4

MySQL Reference manual

A B樹索引可以在使用表達式中使用列比較的=,>,> =,<,< =,或BETWEEN運算符。

對於大量的行,通過樹索引查找行比通過表掃描快得多。但正如其他答案指出的那樣,請使用EXPLAIN來找出MySQL的決定。