xieshy 2021-03-22 17:41 采纳率: 0%
浏览 28

请教mysql SQL语句优化之道

SELECT p.*
FROM item p JOIN item_category c ON p.ItemCategory=c.Code 
LEFT JOIN item_category r ON c.Pid=r.Code 
LEFT JOIN item_category g ON r.Pid=g.Code 
WHERE (p.ItemCategory='10002'  OR c.Pid='10002' OR r.Pid='10002') 
ORDER BY p.Description  LIMIT 0,15;

 

表信息:

item: PRIMARY KEY (SN),ItemCategory字段建有索引,数据量:3014641笔

item_category: PRIMARY KEY(Code),Pid字段建有索引,数据量:98笔

 

问题:

上述SQL执行时间超36秒!!!

经排查,WHERE 条件

(1) 如果采用 WHERE (p.ItemCategory='10002' ),查询结果秒出;

(2) 如果采用 WHERE (p.ItemCategory='10002'  OR c.Pid='10002'),查询耗时不足1秒;

(1) 如果采用 WHERE (p.ItemCategory='10002'  OR c.Pid='10002' OR r.Pid='10002'),查询耗时超36秒。 

 

请教SQL优化之道!

  • 写回答

2条回答 默认 最新

  • Eiffel_Wu 2021-03-23 15:07
    关注

    少用 OR,用它来连接时会索引失效。
    第一个使用了索引,效率最高;第二个OR使索引失效导致全表扫描;第三个会在第二个的基础上翻倍(幂次方)。可以考虑拆分SQL。

    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料