MySQL查詢優化器--非SPJ優化--LIMIT優化

MySQL支持對不帶HAVING子句的LIMIT進行優化,主要的優化點包括:

LIMIT對單表掃描的影響:如果索引掃描可用且花費低於全表掃描,則用索引掃描實現LIMIT(LIMIT取很少量的行,否則優化器更傾向於使用全表掃描)。

LIMIT對排序的影響:如果LIMIT和ORDERBY子句協同使用,當取到LIMIT設定個數的有序元組數後,後續的排序操作將不再進行。

LIMIT對去重的影響:如果LIMIT和DISTINCT子句協同使用,當取到LIMIT設定個數的唯一的元組數後,後續的去重操作將不再進行。

LIMIT受分組的影響:如果LIMIT和GROUPBY子句協同使用,GROUPBY按索引有序計算每個組的總數的過程中,LIMIT操作不必計數直到下一個分組開始計算。

LIMIT 0:直接返回空結果集。


另外,如果是單表排序加LIMIT操作的格式如下:

SELECT ... FROM single_table ... ORDER BY non_index_column [DESC] LIMIT [M,]N;

從SQL語法格式中可以看到,LIMIT子句可以有M和N兩個參數,這兩個參數影響着排序算法,如下從通常的排序算法先介紹沒有LIMIT子句時的排序處理過程,接着對存在LIMIT子句時排序算法受到影響後的變化內容進行介紹,以明確LIMIT操作對排序的影響(注意對兩者進行對比以掌握LIMIT對排序的影響)。


LIMIT對排序算法的影響如下:

通常排序算法:


掃描表,重複如下步驟直到文件結束(可能生成多個待歸併文件)。


把掃描的元組放入排序的緩存(由參數sort_buffer_size設定)直到緩存填滿。


把排序緩存中的前N行(如果指定M,則是M+N行)寫入一個“待歸併文件”。


對歸併文件排序。


按序返回所有文件(歸併所有文件)的前N行(如果指定M,則跳過M行再取N行)。



受LIMIT操作影響改進的算法:(適用於N/M+N行待排序的元素小於排序緩存)


掃描表,把每一個滿足條件的元組插入到一個按排序有序的隊列。


如果隊列滿,則淘汰最後一個再插入新的。


返回前N行(如果指定M,則跳過M行再取N行)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章