一文講解Mysql怎麼依照ID值的順序回傳結果

藏色散人
發布: 2021-10-26 16:42:26
轉載
1879 人瀏覽過

今天遇到一個問題就是有個查詢需要按照指定的ID 值順序來返回結果集其實也可以放在程式中做排序但是突然想看看能不能直接使用Mysql直接查詢返回就找了下還真有輔助函數實作。

Field()函數

Mysql中有提供一個函數Field() 可以依照我們給定的順序來自訂排序

#範例:

假設現在有一張城市資訊表叫regions 有主鍵id 和一個名稱屬性name, 現在想查詢ID 為2、3、1 並依照這個順序回傳

<p>select id, name from regions;#id        name<br> 1        北京 2        上海 3        深圳<br></p>
登入後複製

使用field()

<p>select id, name from regions order by field(id, 2, 3, 1);#id        name<br> 2        上海 3        深圳 1        北京<br></p>
登入後複製

這樣就達到按自定義順序排序的目的了

#效能

<p>mysql> explain select id from regions order by field(id, 2, 3, 1);+---+-------------+---------+------+---------------+-----+---------+-----+------+-----------------------------+|id | select_type | table   | type | possible_keys | key | key_len | ref | rows | Extra                       ||-- | ----------- | ------- | ---- | ------------- | --- | ------- | --- | ---- | ----------------------------|  |1  | SIMPLE      | regions | index| NULL          | id  | 4       | NULL| 3    | Using index; Using filesort |+---+-------------+---------+------+---------------+-----+---------+-----+------+-----------------------------+<br></p>
登入後複製

因為我們在使用Order By Field 的時候指定了是按照主鍵ID 來排序主鍵有個Primary 的主鍵索引他會使用id來尋找條件等於2,3,1 的記錄所以可以看到在Extra 中有Using index 如果你換個別的沒有索引的字段這裡就不會有它了。而Order By 子句不能使用該索引只能使用Filesort 排序也就是Extra 中有Using filesort 的原因

大概過程如下:

##從id索引的第一個葉子節點出發,依序掃描所有葉子節點

根據每個葉子節點記錄的主鍵id去主鍵索引(叢集索引))找到真實的行資料
判斷行資料是否滿足id = 2、 3、1 條件,若滿足,則取出並返回

基本上要遍歷全表了有人說它把選出的記錄的id 在FIELD 列表中進行查找,並返回位置,以位置作為排序依據。

這樣的用法,會導致 Using filesort(當然使用了Filesort 並不一定就會慢 有時候比不是用要更快),是效率很低的排序方式。

通常ORDER BY子句會與LIMIT子句配合,只取出部分行。如果只是為了取出top1的行 卻對所有行進行排序,這顯然不是一種高效的做法。

總結

Field() 函數可以幫助我們在資料庫層直接完成一些需要的排序可以簡化業務程式碼,但是同時它還會有相容性和效能問題建議可以用在資料變化頻率低或有長時間快取的地方,而在資料量很大的情況下可以採用資料庫查詢出資料在到程式中來排序吧

推薦學習:《

mysql影片教學》                                    作用配備「#

以上是一文講解Mysql怎麼依照ID值的順序回傳結果的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板