业务背景:当我们在实际开发过程中经常会遇到排序多重规则,按着时间倒序,按着不同类型不同的升序降序规则,使用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数据引擎进行重排序提升了查询性能