元气小羊. 2022-10-14 18:13
浏览 19
已结题

非驱动表查询排序不走索引,速度很慢;Mysql FIELD方法、order by..超慢

问题遇到的现象和发生背景

遇到的问题:
非驱动表 查询排序不走索引,速度很慢。
查询视图的时候,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 查询出的结果集 要放到最后展示

    img

我的解答思路和尝试过的方法
  1. 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
    
  2. FIELD():
    第二个就改成了上方面的Demo,使用的函数FIELD()进行了制定排序。

  3. Jion:
    一开始是left jion ,后来改成jion了,大小结果集问题,inner jion 和jion一样,就写了jion。

  4. 驱动表 与 非驱动表 切换 (STRAIGHT_JOIN):
    这个方法没法子用,驱动表 a 别的地方大量在用,不能影响到其他模块的排序。

  5. 冗余字段、临时表、虚拟列 貌似都不行

我想要达到的结果

查询时间提升,这个时间太久了!

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月22日
    • 创建了问题 10月14日

    悬赏问题

    • ¥15 BP神经网络控制倒立摆
    • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
    • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
    • ¥30 Unity接入微信SDK 无法开启摄像头
    • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
    • ¥20 cad图纸,chx-3六轴码垛机器人
    • ¥15 移动摄像头专网需要解vlan
    • ¥20 access多表提取相同字段数据并合并
    • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
    • ¥20 Java-Oj-桌布的计算