在MySQL查询中忽略或强制使用某索引

在测试时碰到的问题, 同样的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, 从而排序耗费了相当多的时间.

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在查询中只对一个表使用一个索引, 所以效果并不好. 这种情况需要建立这两者的联合索引, 这样在查询中就可以完全用上了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值