遇到的问题:
非驱动表 查询排序不走索引,速度很慢。
查询视图的时候,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
.OrderId
= a
.Id
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 别的地方大量在用,不能影响到其他模块的排序。
冗余字段、临时表、虚拟列 貌似都不行
查询时间提升,这个时间太久了!