MyBatis/MySQL查詢時實現按照IN裏面字段的順序排序

在進行MySQL查詢時,遇到一個問題:查詢出來的字段的順序需要按照IN裏面值的順序進行排序。
在這裏插入圖片描述

SELECT
	* 
FROM
	test 
WHERE
	xxxx_id IN ( 651877011734764416, 737560066717227904, 738885949361068928 )

注意圖中IN後面的順序和查詢出來的結果的順序。如果WHERE後面沒有ORDER BY字段,無論IN裏面的順序是怎麼樣的,最後的結果都是按照id的進行順排。

若想按照INl裏面的字段排序,此時我們需要用到field(),它是MySQL自定義排序規則函數,一般與IN關鍵字和ORDER BY連用,用於將查詢結果按照field()函數裏面的的順序返回。
在這裏插入圖片描述

##其中field是關鍵字
SELECT
	* 
FROM
	test 
WHERE
	xxxx_id IN ( 651877011734764416, 737560066717227904, 738885949361068928 ) 
ORDER BY
	field( xxxx_id, 651877011734764416, 737560066717227904, 738885949361068928 )

使用MyBatis,只需在ORDER BY後添加該排序函數即可:

		 xxx_id爲需要進行排序的字段,後面的item爲其值
				....................
				....................
  		ORDER BY field(xxx_id,
        <foreach collection="xxxList" item="item" index="index" separator=",">
            #{item,jdbcType=BIGINT}
        </foreach>

當然,該函數若非情非得已,是不推薦使用的。在這裏我做了一個測試,將field()函數裏面的排序字段(字段類型爲BIGINT)作爲唯一索引,在500萬數據下,IN中個數爲4000個時,耗時是不進行ORDER BY 時的兩倍多。

排序前:
在這裏插入圖片描述
在這裏插入圖片描述
排序後:
在這裏插入圖片描述
綜合前面三張圖,500萬數據下,用IN查詢出4000條數據只要0.204s,排序後則需要0.473s .由此可見,當排序字段不爲BIGINT型,且不是唯一索引時,這速度究竟會有多慢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章