问题遇到的现象和发生背景
遇到的问题:
非驱动表 查询排序不走索引,速度很慢。
查询视图的时候,order by 非常的慢。
现象:
Mysql中,多表进行left join(视图)查询,使用了Order By FIELD() 函数进行指定排序,发现不走索引了,导致查询速度很慢。
需求背景:
按照创建时间倒序或者正序排列,请求审核的默认放在最下方。
用代码块功能插入代码,请勿粘贴截图
explain SELECT *
FROM vi_orderinfo b
WHERE 1= 1
and b.Status!= 5
ORDER BY
FIELD(b.Type,0,4,1,2,3) ,
b.CreatedAt DESC;
运行结果及报错内容
现状:
- f 表 Type字段有索引 : NON-Type
- f (非驱动表)表 与 a 表(驱动表),关联关系: a JOIN f ON
f
.OrderId
=a
.Id
- 我需要指定排序,Type=1,2,3 查询出的结果集 要放到最后展示
我的解答思路和尝试过的方法
CASE WHEN
查询出来的也很慢,不走索引SELECT * , case when b.Type in (1,2,3) then 1 else 0 END AS RequestReviewType FROM vi_orderinfo b WHERE 1=1 and b.Status != 5 ORDER BY RequestReviewType ASC, CreatedAt desc
FIELD():
第二个就改成了上方面的Demo,使用的函数FIELD()进行了制定排序。Jion:
一开始是left jion ,后来改成jion了,大小结果集问题,inner jion 和jion一样,就写了jion。驱动表 与 非驱动表 切换 (STRAIGHT_JOIN):
这个方法没法子用,驱动表 a 别的地方大量在用,不能影响到其他模块的排序。冗余字段、临时表、虚拟列 貌似都不行
我想要达到的结果
查询时间提升,这个时间太久了!