我有疑问:
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`);
问题是:我在哪里可以学习如何在许多where条件上创建索引?或者有人可以解释如何告诉mysql使用和索引,而不是扫描整个表。谢谢。
发布于 2012-09-11 03:10:22
我建议不要强制索引。Mysql非常擅长选择最好的索引,除非您对要查询的数据有更好的理解。
您不能使用ORDER BY优化,因为您在该部分中混合了ASC和DESC。
因此,您唯一的选择是创建索引,以便:
创建大型索引还会增加存储和插入-更新时间的开销,所以我不会添加到没有消除大量行的索引字段(即90%或值为1或id<>"18041"
的行,但这很可能会消除< 1%的行)。
如果您想了解有关优化的更多信息,请访问:http://dev.mysql.com/doc/refman/5.0/en/select-optimization.html
创建多个不同的索引(根据您期望在表中看到的适当大小的数据),看看mysql选择哪一个,通过强制每个索引对它们进行基准测试,然后使用您的常识来减少索引空间的使用。
您可以从解释输出中看到,它实际上并没有执行全表扫描,因为在这种情况下,即使您强制执行索引,它也不会使用索引来显示它。
发布于 2012-09-10 23:38:43
您可以尝试使用索引或FORCE INDEX
https://stackoverflow.com/questions/12354836
复制相似问题