mysql优化

SELECT COUNT(*) AS num FROM test WHERE ( a = 111 AND cid = 21432 OR s_status <> 'yes' OR t_status <> 'yes' ) AND test.delete_time IS NULL LIMIT 1

explain 这个语句type显示为ALL该怎么优化?

阅读 2k
2 个回答

个人理解,希望对你有所帮助

  • 使用or分割的条件,如果or前的条件中的列有索引,后面的列中没有索引,那么涉及到的索引都不会使用。
    参考:使用UNION合并查询
  • 负向查询(not,not in,not like,<>,!=,!>,!<)不会使用索引
    参考:如果是确定且有限的集合时,可以使用IN
  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
    参考:将本为null值针对字段类型赋个默认值(String 则为"",以此类推)

楼上正解,首先,要尽量减少一些楼上说的操作。不然,永远是 all 。:) 。看你 sql 语句,可以知道你的需求,应该是统计数据数量。条件分别为 a= 111 ,cid = 21432 | s_status != yes | t_status != yes ,test.delete is null。最终结果为: 好了,不可能的,优化不了,(至少我是)。首先,要想用 索引,先将 null 禁止,用 0 或者其它代替。二,yes 这个不要用不等,用 like 进行检索,可以配合 if 方法。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进