mysql排序機制 MySQL 排序機制

2021-10-19 02:25:28 字數 1238 閱讀 5073

在 mysql 中經常使用 order by 對資料進行排序,其實排序這個行為是比較消耗 io 的過程,有時候需要回表多次才可以完成排序,所以在任何時候都需要對排序的原理要心知肚明。

在 mysql 中排序按照是否使用外部儲存可以分為,記憶體排序和外部排序兩種。根據排序所需的字段可以分成 rowid 排序和全欄位排序兩種。

在 mysql 執行排序的時候會分配一塊記憶體 sort_buffer,mysql 把需要排序的字段放入這個 sort_buffer 中,讓,後在 sort_buffer 執行排序的過程,如果 sort_buffer 大小不夠,就要使用外部儲存。

一般來說 sort_buffer_size 的大小取決於排序的是使用快排(記憶體排序)還是歸併排序(外部排序)。

以上的排序過程都是使用全欄位進行排序的,但是如果 sort_buffer 不足以存放所有排序字段,那麼這時候就需要用到 rowid 排序。

對於 rowid 排序支取 id 和需要排序的字段放入 sort_buffer 中,在 sort_buffer 開始對欄位進行排序。根據排序完成後的 id 再回表找到其他字段組合成結果集返回。

對於 rowid 排序和全欄位排序最大差別在於多一次回表的過程,這也是一次 io 消耗過程(不一定是隨機讀過程)。同時掃瞄次數 rowid 會多餘全欄位排序 n 行,這個 n 就是第二次回表過程根據 id 找到的行的數量。

對於 mysql 來說如果記憶體夠,就要多利用記憶體,儘量減少磁碟訪問,只有分配的記憶體不夠用的時候才會使用 rowid 排序。

那麼,這個過程如何優化?我們可以發現優化的地方有兩個,乙個是排序所消耗的時間,乙個是回表再次讀取的時間。所以優化就可以根據這兩個來。

對於回表這個操作經常和資料量有關係沒有什麼好辦法,一種比較常用的方法就是建立復合索引以減少排序所耗費的時間。如果再 order by 時候字段滿足最左匹配原則,那麼這時候第一次從表載入到 sort_buffer 中本身就有序的,那麼這時候可以直接當做結果返回了,就不需要排序了。

最後,使用 explain 可以分析 sql 的排序方式:

using index:覆蓋索引

using filesort:使用外部排序

沒有 using index 和 using filesort:使用聯合索引

mysql自然排序是什麼 MySQL 自然排序

mysql 自然排序 簡介 在本教程中,您將使用order by子句了解mysql中的各種自然排序技術。讓我們用示例資料開始教程。假設我們有乙個名為items包含兩列的表 id和item no。要建立items表,我們使用create table語句,如下所示 create table if not...

MySQL查詢 3 排序

為了方便檢視資料,可以對資料進行排序 語法 select from 表名 where order by 列1 asc desc 列2 asc desc,說明 例1 查詢未刪除學生的資訊,按名稱公升序 select from students where is delete 0 order by na...

mysql資料排序規則 Mysql 資料庫排序規則

前言 在新建mysql資料庫或表的時候經常會選擇字符集和排序規則。資料庫用的字符集大家都知道是怎麼回事,那排序規則是什麼呢?排序規則 是指對指定字符集下不同字元的比較規則。其特徵有以下幾點 1 兩個不同的字符集不能有相同的排序規則 2 兩個字符集有乙個預設的排序規則 3 有一些常用的命名規則。如 c...