mysql 記憶體排序 mysql 排序過程

2021-10-18 10:02:06 字數 1285 閱讀 1238

order by

sql#city為索引

select city,name,age from zx where city='杭州' order by name limit 1000

sort_buffer

mysql進行排序的時候會分配每個執行緒分配一塊記憶體用於排序

全欄位排序

過程1.首先會根據要查詢的字段初始化sort_buffer,放入city,name,age欄位

2.然後根據city索引找到所有滿足city=『杭州'的資料

3.然後根據之前的查詢結果,根據主鍵id取出需要的資料存入sort_buffer裡面

4.對sort_buffer中的資料按欄位名name進行快速排序

5.最後取前1000條返回結果集

分析從查詢流程中我們知道,真正排序的過程其實就是第4步

第4步,其實還涉及到記憶體和的問題

#sort_buffer_size,就是mysql為排序開闢的記憶體

1.如果資料量不大,可以用sort_buffer完全存下,那麼排序都在記憶體中進行

2.如果資料量太大,sort_buffer存不下,就會利用磁碟的臨時檔案輔助排序

rowid排序

這個排序是專門針對單行資料很大的情況的

max_length_for_sort_data

排序單行資料最大長度,如果超過這個最大長度就會選用rowid進行排序

過程1.初始化sort_buffer,放入主鍵id和需要排序的字段

2.按照索引city,把滿足條件主鍵id取得

3.更具主鍵id取出整行資料,把id和name存入sort_buffer

4.對sort_buffer裡面的資料按照name排序

5.最後根據排序結果,取出前1000行,並按照id取出city,name,age三個字段返回客戶端

全欄位 vs rowid

其實觀察rowid的排序過程,我們可以輕易的發現,資料查詢的過程變的更麻煩了,但是排序都是在記憶體中進行的,這就是它的主要目的,如果涉及到磁碟的讀寫,效率損失的就更厲害了

mysql的設計思想

如果記憶體夠用,就要多利用記憶體,儘量減少磁碟的訪問

為啥要排序?

這就是排序的核心問題,因為查詢出來的資料是無序的,所以我們要對資料排序,所以如果我們實現查詢出來的資料就有序的話,可以直接避免上述的排序過程,這樣的效率才是最高的

但是涉及到資料有序問題,那不避免的就是索引問題,索引也是需要成本的,所以這又是一場效率和成本的權衡問題,要對特定的問題,具體分析

關於索引,可以使用聯合索引或者覆蓋索引等辦法

參考鏈結

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 排序的藝術

前言 業務中的各種查詢通常對應了使用者所看到的各項列表,列表一般是根據某個維度進行排序。換句話說,業務中使用 select 語句的時候除了不可避免的搭配 where 以外,還會配合 order by 進行使用。今天來好好聊聊 mysql 的 order by 排序。排序演算法 說到排序演算法,有插入...