mysql语句优化 不使用强制索引的方式优化

clipboard.png

求网友给个思路或者方法谢谢

SELECT
    a.*,
    b.NAME AS store_name 
FROM
    order a
    LEFT JOIN store b ON a.store_id = b.id 
WHERE
    a.wid = '2001' 
    AND a.id > 0 
    AND a.channel IN ( 3, 4 ) 
    AND a.created_at >= '2019-07-21' 
    AND a.created_at < '2019-07-28' 
    AND a.type IN ( 2, 3 ) 
ORDER BY
    a.id DESC 
    LIMIT 0,
    20
阅读 1.7k
2 个回答

看样子你建了很多索引(wid, created_at, type ... ), 但对复杂的查询条件这样单独字段的索引不会很有效的, 建议建立多字段的联合索引.

CREATE INDEX index_name
ON table_name (id, wid, channel, created_at, type);

具体哪个字段要看数据的分布情况和你的查询/排序条件.

PS: 表名用 order 不是很合适, 必竟是关键字啊

a.wid = '2001' 
    AND a.id > 0 
    AND a.channel IN ( 3, 4 ) 
    AND a.created_at >= '2019-07-21' 
    AND a.created_at < '2019-07-28' 
    AND a.type IN ( 2, 3 ) 

从这一系列条件里,找出选择性好的几个条件,建立复合索引;
对你的数据分布不清楚,没办法确定索引的列。

另外,如果分页20条只是占了不分页的很小一部分,例如如果不分页,返回100万行,那么以id为复合索引的最左列可以避免排序,以及取够了20条数据时及时停止扫描,有奇效:

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