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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

《MySQL——order by逻辑(全字段排序与rowid排序)》

發(fā)布時(shí)間:2023/12/1 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《MySQL——order by逻辑(全字段排序与rowid排序)》 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

創(chuàng)建一個(gè)表,然后使用查詢語句:
查詢城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 個(gè)人的姓名、年齡

create table 't' ('id' int(11) not null,'city' vachar(16) not null,'name' vachar(16) not null,'age' vachar(16) not null,'addr' varchar(128) default null,primary key('id'),key 'city'('city') )engine = InnoDB;select city,name,age from t where city = '杭州' order by name limit 1000;

它的執(zhí)行流程如下:

全字段排序

為了避免全表掃描,需要在city字段上加上索引

假設(shè)滿足city = '杭州’條件的行是從ID_X到ID_(X+N)的這些記錄。
執(zhí)行流程:
1、初始化sort_buffer,確定放入name、city、age三個(gè)字段;
2、從索引city找到第一個(gè)滿足city = '杭州’條件的主鍵id,也就是ID_X;
3、到主鍵id索引取出整行,取name、city、age三個(gè)字段值,存入sort_buffer;
4、從索引city取下一個(gè)記錄的主鍵id;
5、重復(fù)step3、4直到city的值不滿足查詢條件為止,對(duì)應(yīng)的ID(X+N);
6、對(duì)sort_buffer中的數(shù)據(jù)按照字段name做快速排序
7、按照排序結(jié)果取前1000行返回給客戶端

tip:sort_buffer是MySQL分配給每個(gè)線程用于排序的內(nèi)存。
sort_buffer是MySQL分配給每個(gè)線程用于排序的內(nèi)存。sort_buffer_size是sort_buffer的大小,如果要排序的數(shù)據(jù)量小于sort_buffer_size,排序就在內(nèi)存中完成,如果排序數(shù)據(jù)量過大,就得使用磁盤臨時(shí)文件輔助排序。外部排序一般使用歸并排序算法。

rowid 排序

全字段排序方法缺點(diǎn):單行大的話占用內(nèi)存空間。
通過修改MySQL中專門控制用于排序的行數(shù)據(jù)的長(zhǎng)度的一個(gè)參數(shù)。意思是,如果單行的長(zhǎng)度超過這個(gè)值,就會(huì)換一種算法

SET max_length_for_sort_data = 16;

新的算法只會(huì)講排序的列(name字段)和主鍵id放入sort_buffer;
所以排序的結(jié)果就少了city和age字段值,不能直接返回。
執(zhí)行流程如下:
1、初始化sort_buffer,確定放入name和id字段;
2、從city索引中找到第一個(gè)滿足city = '杭州’條件的主鍵id,也就是圖中的ID_X;
3、到主鍵id索引取出整行,取name、id兩個(gè)字段,存入sort_buffer;
4、從city索引取下一條記錄的主鍵id
5、重復(fù)step3、4直到不滿足city = '杭州’為止
6、對(duì)sort_buffer中的數(shù)據(jù)按照字段name進(jìn)行排序
7、遍歷排序結(jié)果,取前1000行,并按照id的值回到原表中取出city、name、age三個(gè)字段返回給客戶端

rowid 方式和全字段方式一樣,需要先把查詢到的結(jié)果全部放在內(nèi)存或硬盤中,再使用相關(guān)算法進(jìn)行排序。而排序后由于沒有保存所需的字段,需要按順序使用主鍵再從索引樹上查詢,查到一個(gè)就返回一個(gè),而不用把所有內(nèi)容查完放到內(nèi)存上再一并返回。

兩者比較

全字段排序 rowid 排序

如果擔(dān)心排序內(nèi)存太小,會(huì)影響排序效率,才會(huì)采用rowid排序算法,這樣排序過程中依次可以排序更多行,但是需要再回到原表去取數(shù)據(jù)。
如果MySQL認(rèn)為內(nèi)存足夠大,會(huì)優(yōu)先選擇全字段排序,把需要的字段都放到sort_buffer中,這樣排序后就會(huì)直接從內(nèi)存里面返回查詢結(jié)果了,不用再回到原表中取數(shù)據(jù)。

對(duì)于InnoDB,rowid排序會(huì)要求回表多造成磁盤讀,因此不會(huì)被優(yōu)先選擇。

總結(jié)

以上是生活随笔為你收集整理的《MySQL——order by逻辑(全字段排序与rowid排序)》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。