2009-11-12 43 views
1

我有一個可以爲空的日期時間字段的表。我應該索引一個字段,如果我只會搜索與FIELD不是空?

我會這樣執行查詢:

select * from TABLE where FIELD is not null 
select * from TABLE where FIELD is null 

我應該指數這一領域或沒有必要?我不會在該字段中搜索某些日期時間值。

+2

只需將索引添加到表中。然後,您可以在查詢中「EXPLAIN」查看它是否使用索引。如果沒有,那麼你可以刪除它。 – 2009-11-12 20:06:45

回答

1

總之:是的。

略長:yeeees。 ;-)

(From http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html) - 「如果col_name被索引,使用col_name IS NULL搜索會使用索引。」

+1

這是不正確的。用X行創建一個表,其中一半具有空日期時間值,其中一半具有非空值。創建索引,在查詢中運行'explain select' - 索引不會被使用。 – ChssPly76 2009-11-12 20:23:08

+0

文檔沒有錯誤,但你需要閱讀和理解整個事情,而不僅僅是似乎處理手頭問題的摘錄。下面是來自同一鏈接的另一個(更相關的)引用:「有時,即使MySQL可用,MySQL也不會使用索引。出現這種情況的一種情況是,當優化程序估計使用索引需要MySQL訪問非常大的表中行的百分比(在這種情況下,表掃描可能會快得多,因爲它需要的搜索次數較少)。「 – ChssPly76 2009-11-12 20:58:04

2

這是可能沒有必要。

當索引可以被使用(併成爲幫助)時,唯一可能的情況是如果null/not-null行的比例相當大(例如,在具有100,000行的表中有100個NULL日期時間)。在這種情況下,select * from TABLE where FIELD is null將使用索引,並且速度更快。

0

這取決於唯一值的數量和表中的記錄數。如果你只是搜索一個列是否爲空,你可能會有一個查詢使用它,一個不依賴於整個表中的空值數量。

例如:如果你有一個表的記錄,99%有查詢欄爲空,你把/對列的​​索引,然後執行:

SELECT columnIndexed FROM blah WHERE columnIndexed is null; 

優化最有可能贏得不使用索引。它不會因爲讀取索引然後讀取記錄的關聯數據而花費更多,而不是直接訪問表。索引的使用是基於對錶格的統計分析,其中一個主要參與者是數值的基數。一般來說,當索引選擇表格中的一小部分行時,索引效果最佳,性能最佳。所以如果你改變上面的查詢來選擇columnIndexed不爲null的地方,你的綁定就會使用索引。

有關更多詳細信息,請查看以下內容:http://dev.mysql.com/doc/refman/5.1/en/myisam-index-statistics.html

相關問題