在MySQL查询中忽略或强制使用某索引
2011-12-18 14:38
645 查看
在测试时碰到的问题, 同样的sql, 在测试环境和产品环境下的explain不一致. 在测试环境下, mysql会使用sc做ref, ot做eq_ref, 但是在产品环境下, 则是ot做ref, sc做eq_ref. 测试环境的sc的table size是产品环境的1/10, 所以有可能是因为表规模的改变导致mysql优化策略结果的变化. 这个变化导致了查询中使用的sc索引为primary(story_id)而不是create_time, 从而排序耗费了相当多的时间.
修改的方式, 就是增加ignore index, 这样时间降低到原先的1/15.
另外还有一个和排序相关的优化. 因为这个查询使用到了sc的language和create_time, 两个字段都各自建有索引, 但是MySQL在查询中只对一个表使用一个索引, 所以效果并不好. 这种情况需要建立这两者的联合索引, 这样在查询中就可以完全用上了.
explain SELECT sc.* FROM pcom_story_content sc INNER JOIN pcom_object_to_tag ot ON sc.story_id = ot.obj_id WHERE ot.tag_id =24 AND ot.obj_type=1 AND sc.language='zh_CN' ORDER BY sc.create_time DESC LIMIT 0, 20;
修改的方式, 就是增加ignore index, 这样时间降低到原先的1/15.
explain SELECT sc.* FROM pcom_story_content sc IGNORE INDEX (PRIMARY, story_id) INNER JOIN pcom_object_to_tag ot ON sc.story_id = ot.obj_id WHERE ot.tag_id =24 AND ot.obj_type=1 AND sc.language='zh_CN' ORDER BY sc.create_time DESC LIMIT 0, 20;
另外还有一个和排序相关的优化. 因为这个查询使用到了sc的language和create_time, 两个字段都各自建有索引, 但是MySQL在查询中只对一个表使用一个索引, 所以效果并不好. 这种情况需要建立这两者的联合索引, 这样在查询中就可以完全用上了.
相关文章推荐
- mysql force Index 查询强制使用索引
- mysql强制使用指定索引查询
- mysql select中子查询中使用强制索引的优化案例
- MySQL Study之--Index的强制使用和忽略
- mysql5.6.19下子查询无法使用索引的疑问的疑问
- mysql5.6.19下子查询为什么无法使用索引
- MySQL查询优化讲座之使用索引
- 查询Mysql未使用的索引
- MYSQL查询优化:使用索引
- mysql 强制使用索引和强制不使用索引
- MYSQL查询优化:使用索引
- MySQL查询不使用索引汇总
- mysql使用索引优化查询效率
- MYSQL强制使用索引和禁止使用索引
- [MySQL 工具] pt-index-usage使用 --> 对查询中的索引进行分析
- Mysql多个LEFT JOIN使用ORDER BY不能使用索引导致查询过慢的解决方案
- mysql慢查询Slow Query Log和未使用索引(Not Using Indexes)查询配置和使用
- MySQL查询不使用索引汇总
- MySQL系列—建索引的几大原则和使用索引优化查询
- mysql 索引的使用和查询语法