2、效能分析(explain)
3、索引優化
【筆記於學習尚矽谷課程所作】慢查詢的開啟並捕獲
explain+慢sql分析
showprofile查詢sql在mysq1伺服器裡面的執行細節和生命週期情況
sql資料庫伺服器的引數調優。
mysql官方對索引的定義為:索引(index) 是幫助mysql高效獲取資料的資料結構。
索引的本質:索引是資料結構
簡單理解為「排好序的快速查詢資料結構」。
資料本身之外,資料庫還維護著乙個滿足特定查詢演算法的資料結構,這些資料結構以某種方式指向資料,這樣就可以在這些資料結構的基礎上實現高階查詢演算法,這種資料結構就是索引。
一般來說索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。
我們平常所說的索引,如果沒有特別指明,都是指b樹(多路搜尋樹,並不- -定是二叉的)結構組織的索引。
索引的分類:單值索引、唯一索引、復合索引
索引的結構:btree索引、hash索引、full-text全文索引、r-tree索引
建立索引1
create
[unique
]index indexname on mytable(columnname(length));
建立索引2
alter mytable add
[unique
]index
[indexname]
on(columnname(length))刪除
drop
index
[indexname]
on mytable;
檢視show
index
from table_ name\g
使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道mysql是如何處理你的sql語句的。分析你的查詢語句或是表結構的效能瓶頸。
具體功能:
如何使用:explain+sql語句
字段解釋
idselect查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序
select_type
查詢的型別
table
顯示這一行的資料是關於哪張表的
type
顯示查詢使用了哪種訪問型別
possible_keys
顯示可能應用在這張表中的索引,乙個或多個。(不一定被實際使用)
key實際使用的索引。如果為null,則沒有使用索引。(查詢中若使用了覆蓋索引,則該索引和查詢的select欄位重疊)
key_len
表示索引中使用的位元組數,可通過該列計算查詢中使用的索引的長度。在不損失精確性的情況下,長度越短越好。(顯示的值為索引欄位的最大可能長度,並非實際使用長度,即key_ len是根據表定義計算而得,不是通過表內檢索出的)
ref顯示索引的哪一列被使用了, 如果可能的話。是乙個常數。哪些列或常量被用於查詢索引列上的值。
rows
根據表統計資訊及索引選用情況,大致估算ib找到所需的記錄所需要讀取的行數。
extra
包含不適合在其他列中顯示但十分重要的額外資訊
查詢的型別,主要是用於區別普通的查詢、聯合查詢、子查詢等的複雜查詢
idselect_type含義1
******
簡單的select查詢,查詢中不包含子查詢或者union
2primary
查詢中若包含任何複雜的子部分,最外層查詢則被標記為
3subquery
在select或where列表中包含了子查詢
4derived
在from列表中包含的子查詢被標記為derived(衍生)。mysql會遞迴執行這些子查詢,把結果放在臨時表裡。
5union
若第二個select出現在union之後,則被標記為union。若union包含在from子句的子查詢中,外層select將被標記為: derived
6union result
從union表獲取結果的select
顯示查詢使用的訪問型別。
從好到壞依次是:system>const>eq_ ref>ref>range>index>all
一般來說,要保證查詢至少達到range級別,最好能達到ref.
型別含義
system
表只有一.行記錄 (等於系統表),這是const型別的特列,平時不會出現,這個也可以忽略不計
const
表示通過索引一次就找到了,const用於比較primary key或者unique索引。因為只匹配一行資料,所以很快。(如將主鍵置於where列表中,mysql就能將該查詢轉換為乙個常量)
eq_ ref
唯一性索引掃瞄,對於每個索引鍵,表中只有條記錄與之匹配。常見於主鍵或唯一索引掃瞄
ref非唯一性索引掃瞄,返回匹配某個單獨值的所有行。(本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,它可能會找到多個符合條件的行,所以他應該屬於查詢和掃瞄的混合體)
range
只檢索給定範圍的行,使用乙個索引來選擇行。key 列顯示使用了哪個索引。(一般就是在你的where語句**現了between、、in等的查詢)
index
full index scan, index 與all區別為index型別只遍歷索引樹。這通常比all快,因為索引檔案通常比資料檔案小。(也就是說雖然ll和index都是讀全表,但index 是從索引中讀取的,而all是 從硬碟中讀的)
allfull table scan,將遍歷全表以找到匹配的行
using flesort:(檔案內排序【壞】)說明mysql會對資料使用乙個外部的索引排序,而不是按照表內的索引順序進行讀取。mysql中無法利用索引完成的排序操作稱為"檔案排序」。
using temporary:(使用臨時表【壞】)使了用臨時表儲存中間結果,mysql在對查詢結果排序時使用臨時表。常見於排序order by和分組查詢group by.
using index:(使用了覆蓋索引【好】)表示相應的select操作中使用了覆蓋索引(covering index), 避免訪問了表的資料行(如果同時出現using where,表明索引被用來執行索引鍵值的查詢;如果沒有同時出現usingwhere,表明索引用來讀取資料而非執行查詢動作)
using where:表明使用了where過濾
using join buffer:使用了連線快取
…口訣:
全值匹配我最愛,最左字首要遵守;
帶頭大哥不能死,中間兄弟不能斷;
索引列上少計算,範圍之後全失效;
like百分寫最右,覆蓋索引不寫星;
不等空值還有or,索引失效要少用;
var引號不可丟,sql高階也不難;
MySQL高階 索引優化分析
二.效能分析 4 explain欄位解釋 select type 5 explain欄位解釋 table 6 explain欄位解釋 type 7 explain欄位解釋 possible keys 8 explain欄位解釋 key 9 explain欄位解釋 key len 10 explain...
MySQL索引優化分析
1.通過訂單號查詢某個訂單,用唯一索引 資料量幾百萬以上 2.order by 排序時,後面欄位加 強制指定索引 select from orderforce index idx ordere order by order level,input date 哪些情況需要建索引 1 主鍵,唯一索引 2...
MySQL索引優化分析(四)
1.order by子句,盡量使用index方式排序,避免使用filesort方式排序 a.mysql支援兩種方式的排序,filesort和index,index效率高 它指mysql掃瞄索引本身完成排序。filesort效率低。b.order by 滿足兩種情況,會使用index方式排序 1,or...