写了一个SQL,前端往返时间大约1.7秒,最终优化到一共150毫秒左右,应该还可以更好一些
下面说的有点乱,有空再好好总结一下吧。参考文章里面写的还是比较好的,只不过没有组合查询。
参考链接:https://zhuanlan.zhihu.com/p/47313236
sql的一部分:把表名去掉了
explain query plan
select codes,value,unit,starttime,endtime,quality from (
-- explain query plan
select ifNull(p.code,'00')||'-'||ifNull(pu.code,'00')||'-'||ifNull(eq.code,'00')||ifNull(e.code,'00')||'-'||ifNull(c.pclass,'00')||ifNull(c.code,'00')||'-'||ifNull(u.code,'00') codes, d.value value,d.unit unit,t.starttime starttime,t.endtime endtime,d.quality from d
left join p on d.processid = p.id
left join pu on d.processunitid = pu.id
left join e on d.equipmentid = e.id
left join eq on e.parentid = eq.id
left join c on d.collectItemid = c.UUID
left join t on d.timerangeid = t.id
left join u on d.usageid = u.id where 1=1
) RetureData order by starttime desc;
这是执行计划,Data表还是不能做到不全表扫描,但是会走索引的,一开始没加索引不走索引很慢,如果不全表扫描的话可能是要在where中添加使用索引里的条件
首先学到的知识是:走不走索引看的是where后的条件,select里如果有索引外的字段则需要回表,也就是Using Index,不回表显示的是USING COVERING INDEX,最后那句话是生成了一个临时表进行排序会变慢,我没有想到怎么加索引能去掉,试了好几个都不行,而且我加了starttime 的索引。
where中是and的话索引就与索引创建的顺序没关系,如果是or的话就应该需要多个索引,最佳作前缀原则,不然会导致索引失效。order by 的字段,先按where来过滤数据,在将数据排序,所以需要组合所有 where字段+order by字段