1. 程式人生 > 資料庫 >你真的知道怎麼優化SQL嗎

你真的知道怎麼優化SQL嗎

簡介

雖然使用Explain不能夠馬上調優我們的SQL,它也不能給予我們一些調整建議,但是它能夠讓我們瞭解MySQL 優化器是如何執行SQL 語句的

通過Explain,我們可以分析出以下結果:

  • 表的讀取順序
  • 資料讀取操作的操作型別
  • 哪些索引可以使用
  • 哪些索引被實際使用
  • 表之間的引用
  • 每張表有多少行被優化器查詢

Explain命令的用法十分簡單,在 select語句前加上 Explain 就可以了,例如:

explain select * from user;

它的結果主要包含以下欄位

id、select_type、table、partitions、type、possible_keys、key、ref、rows、filtered、extra

接下來我們來看一下各個欄位的含義

id 查詢序列號

載入表的順序

連線查詢各個表的載入順序是相同的,所以都為1

包含子查詢的時候,先執行子查詢,所以user表的id值最大

select_type 查詢型別

常用取值有:

  • SIMPLE:簡單的select查詢,不包含子查詢和索引
  • PRIMARY:查詢中若包含任何子查詢,最外層查詢則為記為PRIMARY
  • SUBQUERY:在SELECT或WHERE列表中包含了子查詢
  • DERIVED:在FROM列表中包含的子查詢被標記為DERIVED(衍生),MySQL會遞迴執行這些子查詢,把結果放在臨時表中
  • UNION:若第二個SELECT出現在索引之後,則被標記為UNION:若索引包含在FROM子句的子查詢中,外層SELECT將被標記為:DERIVED
  • UNION RESULT:從索引表獲取結果的查詢

table查詢涉及的表或衍生表

type查詢型別

通過 type 欄位,我們可以判斷此次查詢是全表掃描還是索引掃描等,type 常用的取值有:

system:表只有一條資料

const:針對主鍵或唯一索引的等值查詢掃描,簡單理解為一次讀取就獲取到了資料,例如下面這個主鍵索引的查詢

eq_ref:唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃描

ref:非唯一性索引掃描,返回匹配某個單獨值的所有行

range:表示使用索引範圍查詢,例如=、<>、>、>=、<、<=、IS、 NULL、<=>、BETWEEN、IN等

index: 所要查詢的資料直接在索引樹中就可以獲取到,而不需要掃描資料,例如:

ALL: 表示全表掃描,這個型別的查詢是效能最差的查詢

type 型別的效能比較

通常來說,不同的 type 型別的效能關係如下:

ALL < index < range < ref < eq_ref < const < system

possible_keys查詢時能夠使用到的索引.

possible_keys 表示 MySQL 在查詢時,能夠使用到的索引. 注意並不是一定用,實際使用是由 由 key 欄位決定

key 查詢使用的索引

此欄位是 MySQL 在當前查詢時所真正使用到的索引.

key_len使用索引的位元組數

這個欄位可以評估組合索引是否完全被使用,或只有最左部分欄位被使用到.

rows MySQL估算要查詢到結果集需要掃描讀取的資料行數

Extra額外的資訊

常見的有以下幾種內容:

  • Using filesort:MySQL 需額外的排序操作,不能通過索引順序達到排序效果. 一般有 Using filesort,都建議優化去掉,因為這樣的查詢 CPU 資源消耗大.
  • Using index:表示查詢在索引樹中就可查詢所需資料,不用掃描表資料檔案,往往說明效能不錯
  • Using temporary:查詢有使用臨時表,一般出現於排序,分組和多表 join 的情況,查詢效率不高,建議優化.
  • Using where:表明使用了where過濾
  • Using join buffer:表明使用了連線快取,比如說在查詢的時候,多表join的次數非常多,那麼將配置檔案中的緩衝區的join buffer調大一些
  • impossible where:where子句的值總是false,不能用來獲取任何元組
  • select tables optimized away:在沒有GROUPBY子句的情況下,基於索引優化MIN/MAX操作或者對於MyISAM儲存引擎優化COUNT(*)操作,不必等到執行階段再進行計算,查詢執行計劃生成的階段即完成優化
  • distinct:優化distinct操作,在找到第一匹配的元組後即停止找同樣值的動作

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。