2012-09-10 96 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