<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們都知道使用explain
分析sql語句的時候,如果,在Extra
這一列發現Using index
說明使用了覆蓋索引,沒有回表操作效能還不錯;那麼,如果發現是Using filesort
、Using temporary
出現了檔案排序,臨時表, 這個時候,我們就需要進行索引優化了;那麼,問題來了,我們需要怎麼優化呢?為什麼出現這兩個的時候,Mysql
是怎麼執行的呢?效率怎麼就低下呢?所以,如果不知道它的執行原理的話,其實,我們也無法進行鍼對性的優化;所以,本文主要就是探討一下Mysql 出現Using filesort
、Using temporary
時的場景和優化方法;
Using filesort: 檔案排序;我們首先來模擬一下檔案排序,然後再分析一下為什麼檔案排序效率較低;最後,在來說一下解決方案;
建表語句
CREATE table study ( id int(11) not null, name varchar(32) DEFAULT NULL, score int(11) DEFAULT NULL, PRIMARY key (id) ) ENGINE=INNODB DEFAULT CHARSET=utf8;
現在,有一個需求需要把所有的同學都找出來,然後,按照成績從高到低進行排序;很顯然,sql語句可以這麼寫:
select id, name, score FROM study order by score DESC;
然後,我們對這個sql語句使用explain進行分析:
分析結果如下:使用的是全表掃描,在掃描的過程中,出現了Using filesort檔案排序;很顯然,對於檔案排序我們需要進行優化;
Using filesort 檔案排序,其實檔案排序的話,會有很多種情況,比如說:根據要排序的內容大小,就有內部排序和外部排序;如果,排序的內容比較小,那麼,在記憶體中就可以搞定,這就是內部排序(使用快排);如果,要排序的內容太大,那麼,就得需要通過磁碟的幫助了,這個就是外部排序(使用歸併)。
還有,就是根據一行的大小來進行區分,如果,一行的內容不是很大,那麼,就整個欄位讀取出來進行排序,稱為全欄位排序;如果,整個欄位內容很大,那麼,就採用rowid排序,讀取rowid和該欄位先進行排序,然後,再回表查詢其他的內容; 下面,我將分別解釋在全欄位排序和rowid排序的時候,這個sql的執行過程;
sql執行過程
注意:第三步可能是在記憶體中完成,但是,如果記憶體中排序資料量太大,記憶體放不下,則不得不利用磁碟臨時檔案輔助排序,如果,記憶體放不下的話,使用的就是外部排序,(將快排的結果寫入到臨時檔案中)外部排序使用的是歸併排序;(兩個有序檔案使用歸併排序,時間複雜度為N效率較高)
總結:針對,Using filesort的全欄位排序,使用快排時間複雜度為NlogN。所以,效率較低;應該避免。
rowid:一張表中如果沒有主鍵或者非空唯一索引時,就會建立一個rowid大小為6位元組;
產生背景: 在我們排序的過程中,因為,sort_buffer是有限的,如果,我們要查詢的欄位很多的話,那麼,sort_buffer裡面要放的欄位數太多,這樣記憶體能夠同時放下的行數就會很少,就需要分成多個臨時檔案,再進行歸併,排序的效能會很差;
為了解決這個問題,Mysql會進行優化,如果,一行資料大於一個閾值的話,讀入到記憶體的時候,就是讀取rowid + 要排序的欄位;然後,再通過rowid回表去查詢剩餘的欄位;我們通過SHOW VARIABLES LIKE '%max_length_for_sort_data%';
這個指令可以檢視這個閾值;
使用rowid的sql執行過程
針對,這個題目來說,解決方案也是比較簡單的;要查詢的欄位是id , name, score;然後,需要對score進行排序。可以對score + name 建立聯合索引,id是主鍵,這樣,這三個欄位都在普通索引中能夠查詢到,就解決了檔案排序,也使用了覆蓋索引;
create index index_score_name on study(score, name);
explain分析:
type = index 表示基於索引列的掃描;Extra = Using index 表示覆蓋索引 Extra = Backward index scan;表示基於索引從後往前找;效果較佳;經過測試,使用索引,以空間換時間,把資料提交按照score排好序,符合我們的需求;
背景Mysql 執行查詢語句時,對於order by 可能會導致filesort或者temporary。
原則:filesort只能應用於單個表上,如果,有多個表的資料需要進行排序,那麼,Mysql會先建立一張臨時表來儲存資料,然後,再在臨時表上使用filesort進行排序,最後輸出結果。
建表語句:
create table t1( id int, col1 int, col2 varchar(10), key(id, col1));
create table t2( id int, col1 int, col2 varchar(10), key(col1));
情況一:
explain select * from t1 force index(id), t2 where t1.id=1 and t1.col1 = t2.col2 order by t1.col1;
這邊,即沒有使用temporary 也沒有使用filesort。
那麼,它是怎麼執行的呢?
它其實是先定位t1.id;然後,定位t1.col1;這兩個都是通過索引來進行;然後,在執行和t2表的聯結(where)所以,沒有檔案排序和臨時表;
情況二:
explain select * from t1 force index(id), t2 where t1.id=1 and t1.col1 = t2.col2 order by t1.col2;
這裡是產生了filesort;執行過程如下:
情況三:
explain select * from t1 force index(id), t2 where t1.id=1 and t1.col1 = t2.col2 order by t2.col1 ;
這裡,產生了temporary 和 filesort;執行過程如下:
通過,對temporary的分析,如果,要排序的欄位在主表上,是不會產生temporary的;所以,如果可以的話,我們儘量修改sql語句 把要排序欄位放在主表中;或者使用straight_join
(強制把左邊的表設定為驅動表); 針對情況三sql重寫:
select * from t2 force index(col1) straight_join t1 on t1.id=1 and t1.col1 = t2.col2 order by t2.col1 ;
explain分析如下:
本文主要是根據個人寫了filesort、temporary 產生原因,處理方式;在處理方案上,可能考慮不足,如果,有一些其他的產生原因或者處理方案。歡迎交流;
到此這篇關於淺談Using filesort和Using temporary 為什麼這麼慢的文章就介紹到這了,更多相關Using filesort Using temporary內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45