Mysql多字段多重排序小技巧

业务背景:当我们在实际开发过程中经常会遇到排序多重规则,按着时间倒序,按着不同类型不同的升序降序规则,使用case when then end 进行处理 示例如下:

SELECT
        ali.AUCR_ID AS aucrId,
        bai.AUCR_ABBRE AS aucrAbbre,
        bai.AUCR_APP_LOGO AS aucrLogo,
        ali.LIVE_ID AS liveId,
        ali.LIVE_NAME AS liveName,
        1 AS type,
        ali.LIVE_STATUS AS liveStatus,
        ali.LIVE_TITLE_PIC AS videoPic,
        '' AS videoUrl,
        ali.REAL_ONLOOK AS lookCount,
        ali.LIVE_START_TIME AS startTime 
    FROM
        app_live_info ali
        JOIN base_auctioneer_info bai ON ali.AUCR_ID = bai.AUCR_ID 
    WHERE
        ali.AUCR_ID IN ( 2371, 2382, 2376 ) 
        AND ali.LIVE_STATE = 1 
        AND bai.AUCR_STATE = 1 
    ORDER BY
    CASE   
            WHEN ali.LIVE_STATUS IN ( 0, 1 ) THEN
            ali.LIVE_STATUS 
        END DESC,
    CASE   
            WHEN ali.LIVE_STATUS = 3  THEN
            ali.LIVE_START_TIME 
        END ASC,
    CASE 
            WHEN ali.LIVE_STATUS = 2 THEN
            ali.CREATE_TIME 
    END DESC 

小技巧大用处,还有就是如果当数据量非常大时,排序规则尽量保证一致化,即要么同时升序要么同时降序,当不满足这个排序条件时,我们可以采用新增字段使之排序一致化。

举个示例:

例如:如果项目进行中 按着开始时间升序,如果项目已结束,则按着id降序

问题所在:当数据量不大时,mysql千万级别以下都ok,但是如果千万级别以上就会存在排序性能问题

解决思路:既能满足开始时间升序,又能满足id降序,好的,新增一个字段,此字段为未来一个时间可以定义为2100年-开始时间的差,这样我们就可以这样写sql

order by 时间差字段 desc,id desc 则保证了都是降序排序,规避了mysql数据引擎进行重排序提升了查询性能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力终会有回报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值