日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql orderby多个_MySQL OrderBy

發布時間:2023/12/2 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql orderby多个_MySQL OrderBy 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL會為每個線程分配一個內存(sort_buffer)用于排序,該內存小大為 sort_buffer_size

如果排序的數量小于 sort_buffer_size,排序將會在內存中完成。

如果排序數據量很大,內存中無法存下這么多數據,則會使用磁盤臨時文件來輔助排序,也稱外部排序

在使用外部排序時,MySQL 會分成好幾份單獨的臨時文件用來存放排序后的數據,然后再將這些文件合并成一個大文件

MySQL 會通過遍歷索引將滿足條件的數據讀到 sort_buffer,并且按照排序字段進行快速排序

如果查詢的字段不包含在輔助索引中,需要按照輔助索引記錄的主鍵返回聚集索引所需字段。

該方式會造成隨機 IO,在MySQL 5.6提供了 MRR 機制,會將副主索引匹配記錄的主鍵取出來再內存中進行排序,然后再回表

按照情況建立聯合索引來避免排序鎖帶來的性能損耗,允許的情況下也可以建立覆蓋索引來避免回表。

全字段排序

通過索引將所需的字段全部讀取到 sort_buffer 中

按照排序字段進行排序

將結果返回給客戶端

缺點:

造成sort_buffer 中存放不下很多數據,因為除了排序字段還存放其他字段,對 sort_buffer 的利用效率不高

當所需排序數據量很大時,會有很多的臨時文件,排序性能也會很差

優點: MySQL 認為內存足夠大時會優先選擇全字段排序,因為這種方式比 row_id排序避免了一次回表操作

rowid 排序

通過控制排序的行數據的長度來讓 sort_buffer 中盡可能多地存放數據,max_length_for_sort_data

只將需要排序的字段和主鍵讀到 sort_buffer 中,并按照排序字段進行排序

按照排序后的順序,取id 進行回表取出想要獲取的數據

將結果集返回給客戶端

優點:更好地利用內存的 sort_buffer 進行排序操作,盡量減少對磁盤的訪問

缺點:回表的操作時隨機 IO,會造成大量的隨機讀,不一定就比全字段排序減少對磁盤的訪問

按照排序的結果返回客戶端所取行數

隨機取出三行數據的需求

order by rand() 這個語句需要 Using temporary 和 Using filesort,查詢的執行代價比較大

使用表的主鍵 id 的最大值和最小值來做隨機算法。

這種方法如果在 id 有空洞的情況下,就不是真正的隨機。代價比 1 小很多,因為只使用了 id 字段,沒有像1 一樣,需要在 order by rand() 方法組成的臨時表排序,再獲取 rowid 再回表。如果數據庫使用了軟刪除,就可以避免空洞的情況,減少掃描行數。

取出整個表的行數C,隨機獲取三個隨機值y1,y2,y3,limit y,1 得到三個數據。掃描行數 是 總行數c+(y1+1)+(y2+1)+(y3+1)

可以進一步優化:limit Ymin, (Ymax-Ymin), 取出id 后計算出 Y1,Y2,Y3對應的 id ,然后 select in ids,掃描行數減少為 C + ymax +3.

在實際的應用中,應該避免讓 mysql 來排序,盡量將業務邏輯寫在業務代碼中,讓數據庫只做 “讀寫數據” 的事情。

總結

以上是生活随笔為你收集整理的mysql orderby多个_MySQL OrderBy的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。