2012-09-10 99 views
0

我有查詢: 創建MySQL的索引

EXPLAIN SELECT * FROM _mod_news USE INDEX (ind1) WHERE show_lv =1 AND active =1 AND START <= NOW() 
AND (END >= NOW() OR END = "0000-00-00 00:00:00") AND id <> "18041" AND category_id = "3" AND leta =1 ORDER BY sort_id ASC , DATE DESC LIMIT 7 

結果:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE _mod_news ref ind1 ind1 2 const,const 11386 Using where; Using filesort 

MySQL是執行全表掃描

IND1 =

ALTER TABLE `_mod_news` ADD INDEX ind1 (`show_lv`, `active`, `start`, `end`, `id`, `category_id`, `leta`, `sort_id`, `date`); 

我對以下指標進行測試,但沒有任何變化

ALTER TABLE `_mod_news` ADD INDEX ind1 (`show_lv`, `active`, `start`, `end`, `id`, `category_id`, `leta`); 

的問題是:我在哪裏可以學習如何在許多創建索引,有條件的地方?或者有人可以解釋如何告訴mysql使用和索引而不是掃描整個表。 謝謝。

+0

您的'WHERE'子句中的所有列都需要位於要使用的索引的索引上。 – Kermit

+1

我已經有了這個索引。也許MySQL不喜歡'OR'? – Guntis

+0

您可能需要在保留字周圍使用刻度線,例如'END'。 – Kermit

回答

1

我建議不強制索引嘗試。除非您更好地瞭解您正在查詢的數據,否則Mysql非常適合選擇最佳索引。

您不能使用ORDER BY優化,因爲您正在混合該部分中的ASC和DESC。

所以你唯一的選擇是創建索引這樣的:範圍之前

  • 常量
  • 日期,字符串前的日子,更小的尺寸VALES整數以前更大尺寸值

創建前一個大的索引也增加了存儲和插入更新時間的開銷,所以我不會添加到不會消除很多行的索引字段(即90%或行的值爲1或即id<>"18041",但最有可能消除< 1%的行)。

如果您想了解更多有關優化:http://dev.mysql.com/doc/refman/5.0/en/select-optimization.html

創建多個不同的索引(數據你期望看到在表的體面的大小),看看哪一個MySQL的選擇,標杆他們迫使他們中的每一個,然後用你的常識來減少索引空間的使用。

您可以從中看到EXPLAIN輸出,它實際上並不執行全表掃描,因爲在這種情況下,即使在強制執行時也不會使用索引顯示它。

+0

謝謝。但是rows = 11386,這意味着mysql正在使用11386行? – Guntis

0

你可以用USE INDEX或FORCE INDEX

+0

我已經有'使用索引',並解釋顯示'ind1'被使用。 – Guntis