站長資訊網
        最全最豐富的資訊網站

        一文講解Mysql怎么根據ID值的順序返回結果

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

        Field()函數

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

        示例:

        假設現在有張城市信息表 叫 regions 有 主鍵 id 和 一個名稱屬性 name, 現在想查詢 ID 為 2、3、1 并按照這個順序返回

        select id, name from regions;#id name
        1 北京 2 上海 3 深圳

        使用 field()

        select id, name from regions order by field(id, 2, 3, 1);#id name
        2 上海 3 深圳 1 北京

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

        性能

        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 |+---+-------------+---------+------+---------------+-----+---------+-----+------+-----------------------------+

        因為我們在使用 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視頻教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲国产精品热久久| 久久久久久一区国产精品| 国产高清在线精品一本大道国产 | 国产第一福利精品导航| 欧美精品一区二区久久| 99久久精品国产一区二区| 国产精品美女久久久m| 合区精品久久久中文字幕一区| 91精品国产综合久久四虎久久无码一级| 亚洲av午夜福利精品一区人妖| 精品综合久久久久久97超人| 国产精品1024香蕉在线观看| 日韩精品少妇无码受不了| 亚洲国产精品不卡毛片a在线| 国产精品原创巨作?v网站| 欧美精品在线一区| 国产精品91视频| 国产成人精品AA毛片| 色欲精品国产一区二区三区AV| 无码精品人妻一区二区三区影院 | 大伊香蕉精品一区视频在线| 亚洲国产美女精品久久久久∴| 无码精品一区二区三区在线| 亚洲国产91精品无码专区| 欧美日韩精品久久久免费观看| 久久国产成人精品国产成人亚洲| 91精品国产麻豆国产自产在线| 华人在线精品免费观看| 国产亚洲精品xxx| 久久精品国产影库免费看| 久久精品这里热有精品| 青青青国产精品国产精品久久久久| 国产精品污视频| 四虎国产精品免费久久5151| 国产a视频精品免费观看| 99久久久国产精品免费无卡顿| 精品国产乱码一区二区三区| 精品视频一区二区三三区四区| 亚洲欧美精品SUV| 免费精品视频在线| 精品偷自拍另类在线观看丰满白嫩大屁股ass |