2020 11 22 mysql中,什麼是filesort?

時間 2021-12-28 06:28:45

1樓:

回答這個問題首先我們說說一條簡單的查詢語句是怎麼執行的。如下:

select name,age,city from table where city='北京' order by name limit 2000;

這條語句的的意思很簡單就是查詢城市這列是」北京「的人的姓名,年齡,和城市,並且按照name欄位排序,返回前2000行資料。

首先確定city欄位是有索引的如下圖:

查詢過程大概是如下過程:

1、在記憶體中初始化排序空間(sort_buffer),用來放入需要查詢出來的字段(name,age,city)

2、從索引中找到第乙個滿足條件(city='北京')的主鍵ID

3、通過主鍵ID獲取整行並取對應的資料,儲存到排序空間(sort_buffer)

4、繼續尋找下乙個符合條件的記錄。

5、重複3,4步驟一直到不滿足條件為止

6、對排序空間(sort_buffer)中的資料進行按照name欄位快速排序

7、取前2000行資料返回客戶端

(注意這裡排序的行數很可能是大於2000行的,因為把city='北京'的資料都取出來了)

這個排序過程中一般都是在記憶體中完成的,但是如果你的記憶體不夠大,確切的說,你要排序的資料占用的記憶體空間大於mysql sort_buffer_size設定的大小,這個時候mysql就需要借助磁碟儲存空間來輔助排序,這個操作就叫做filesort。

通過上面的講解很明顯如果mysql使用了filesort操作會很慢,怎麼優化那?

很直觀的想法就是擴大 sort_buffer_size大小,但是資料量很大還是很慢的,只不過省出來了讀寫磁碟的時間而已。

一般情況下我們直接建立聯合索引就可以達到目的

mysql中not in和not exists兩種查詢到底哪種快

聿明leslie 看了這個問題的不少答案,給我的感覺就是回答得都太過表面。雖然在OceanBase我是從事SQL方向研發工作的,但總的來說,我實在害怕回答SQL方向的問題,給我的感覺就是每次看到這類問題,都太難回答了。混跡知乎的資料庫板塊好幾年,看了好多問題,總體感覺就是國內研究資料庫的環境太差,大...

Mysql中怎樣實現check約束?

愛可生雲資料庫 現在要說的是在列這一層次過濾的基於表定義之前就規範好的 CHECK 約束。MySQL 版本 8.0.16 mysql create table f1 r1 int constraint tb f1 r1 chk1 check mod r1,3 0 Query OK,0 rows af...

MySQL中NULL值有什麼意義?

Jack 自己回答自己的問題吧。先吐槽下知乎,居然沒有顯示問題提問時間的地方。這個問題大概是自己剛剛入行做DBA 的時候,一直沒搞懂NULL到底是幹嘛的,後來經過陸續的學習了解,有了一些認知 NULL值的含義 1.NULL不是空 2.什麼是空,空就是沒有,比如說,錢包裡是空的,這個位置沒人佔,但是,...