首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建mysql索引

创建mysql索引
EN

Stack Overflow用户
提问于 2012-09-10 23:29:33
回答 2查看 583关注 0票数 0

我有疑问:

代码语言:javascript
运行
复制
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

结果:

代码语言:javascript
运行
复制
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 =

代码语言:javascript
运行
复制
ALTER TABLE `_mod_news` ADD INDEX ind1 ( `show_lv`, `active`,  `start`, `end`, `id`, `category_id`, `leta`, `sort_id`, `date`);

我在以下索引上进行了测试,但没有任何变化

代码语言:javascript
运行
复制
ALTER TABLE `_mod_news` ADD INDEX ind1 ( `show_lv`, `active`,  `start`, `end`, `id`, `category_id`, `leta`);

问题是:我在哪里可以学习如何在许多where条件上创建索引?或者有人可以解释如何告诉mysql使用和索引,而不是扫描整个表。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-11 03:10:22

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

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

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

  • range之前的常量值
  • 日期之前的整数,字符串之前的日期,较小的值之前的较小的值

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-10 23:38:43

您可以尝试使用索引或FORCE INDEX

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12354836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档