0

我有疑问:

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使用和索引而不是扫描整个表。谢谢。

4

2 回答 2

1

我建议不要强制索引。Mysql 擅长选择最佳索引,除非您对正在查询的数据有更好的理解。

您不能使用 ORDER BY 优化,因为您在该部分中混合了 ASC 和 DESC。

因此,您唯一的选择是创建索引,以便:

  • 范围前的常数值
  • 日期前的整数,字符串前的日期,较大尺寸值前的较小尺寸值

创建一个大索引也会增加存储和插入更新时间的开销,所以我不会添加到没有消除很多行的索引字段(即 90% 或行的值为 1 或 ieid<>"18041"但很可能会消除< 1% 的行)。

如果您想了解有关优化的更多信息:http: //dev.mysql.com/doc/refman/5.0/en/select-optimization.html

创建多个不同的索引(根据您希望在表中看到的适当大小的数据),查看哪个 mysql 选择,通过强制每个索引对它们进行基准测试,然后使用您的常识来减少索引空间的使用。

您可以从 EXPLAIN 输出中看到它实际上没有执行全表扫描,因为在这种情况下,即使您强制它,它也不会使用索引显示它。

于 2012-09-10T19:10:21.873 回答
0

您可以尝试使用 USE INDEX 或FORCE INDEX

于 2012-09-10T15:38:42.630 回答