MySQL-联合索引与Where子句的优化问题

MySQL-联合索引与Where子句的优化问题

甜柠檬 发布于 2016-12-13 字数 304 浏览 1101 回复 3

网站系统上线至今,数据量已经不知不觉上到800M,近15W记录了。涉及数据库操作的基本都是变得很慢了,用的人都会觉得躁火~~

SELECT ... WHERE p.languages_id = 1 AND m.languages_id = 1 AND c.languages_id = 1 AND t.languages_id = 1 AND p.products_id IN (4172,4974)

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晚风撩人 2017-06-18 3 楼

查询不仅跟条件的顺序有关系的原因,是首先你查询出来结果集大小,把过滤掉最小的结果集放在最前面,当然这个不是绝对的,还要看是否能够应用到主索引,要看你的SQL语句,通过explain找到一条最优的执行计划。看到你的问题中提到了各个字段都建了索引,索引并不是建的超多越好,这个需要根据实际情况考虑。

夜无邪 2017-03-01 2 楼

用分析Explain SQL一分析,发现在第一次分析过程中就返回了几万条数据:
  WHERE p.languages_id = 1 ,然后再依次根据条件,缩小范围。
我改变一下WHERE 字段的位置之后,速度就有了明显地提高:
  WHERE p.products_id IN (4172,4974) AND p.languages_id = 1 AND m.languages_id = 1 AND c.languages_id = 1 AND t.languages_id = 1

  这样,第一次的条件是p.products_id IN (4172,4974),它返回的结果只有不到30条,接下来还要根据其它的条件来过滤,自然在速度上有了较大的提升。
经过实践发现,不要以为WHERE中的字段顺序无所谓,可以随便放在哪,应该尽可能地第一次就过滤掉大部分无用的数据,只返回最小范围的数据。

灵芸 2017-01-19 1 楼

where子句优化中有一条是子句顺序优化,看你各个表的情况了,你看你的where子句都是AND,这样程序在执行是就是顺序执行了,所以感觉你的p.products_id IN (4172,4974) 东东应该放到前面,这样可以过滤很多无用的数据,下面在过滤就快多了,你测试一下速度!