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 排序。排序演算法 說到排序演算法,有插入...