Mysql的索引 效能分析與SQL優化

2021-10-03 01:51:03 字數 4085 閱讀 1778

索引效能分析

sql優化

優化策略

慢查詢日誌

鎖機制b樹

對比項myisam

innnodb

主外來鍵不支援

支援事物

不支援支援

行表鎖表鎖,即使操作一條記錄

行鎖快取

只快取索引,不快取真實資料

索引與資料都會快取,堆記憶體要求較高,

且記憶體大小對效能有決定性的影響

表空間小

大關注點

效能事物

預設安裝yy

mysql官方對索引的定義為:索引(index)是幫助mysql高校獲取資料的資料結構。

可以得到索引的本質:索引是資料結構。

資料本身之外,資料庫還維護著乙個滿足特定查詢演算法的資料結構,這些資料結構以某種方式指向資料,

這樣就可以在這些資料結構的基礎上實現高階查詢演算法,這種資料結構就是索引。

我們平時所說的索引,如果沒有特別指明,都是指b樹(多路搜尋樹,並不一定是二叉樹)結構組織的索引。其中聚集索引,次要索引,覆蓋索引,復合索引,字首索引,唯一索引預設都是使用b+樹索引,統稱索引。當然,除了b+樹這種型別的索引之外,還有雜湊索引(hash index)等。

單值索引

唯一索引

復合索引

基本語法

覆蓋索引

全文索引

只有在myisam引擎上才能使用,而且只能在char,varchar,text型別欄位上使用全文索引。

聚集索引(myisam)

b+樹葉子節點只會儲存資料行(資料檔案)的指標,簡單來說資料和索引不在一起,就是非聚集索引

id:select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序

包括三種情況

select_type:查詢的型別,主要用於區別普通查詢、聯合查詢、子查詢等的複雜查詢,包括六種

table:顯示這一行的資料是關於哪張表的

type:顯示查詢使用了何種型別,從最好到最差依次是:system>const>eq_ref>ref>range>index>all

possible_keys:顯示可能應用在這張表中的索引,乙個或多個。查詢涉及的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用

key:實際使用的索引。如果為null則沒有使用索引,查詢中若使用了覆蓋索引,則索引和查詢的select欄位重疊

key_len:表示索引中使用的位元組數,可通過該列計算查詢中使用的索引的長度。在不損失精確性的情況下,長度越短越好,key_len顯示的值為索引最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索出的

ref:顯示索引那一列被使用了,如果可能的話,是乙個常數。那些列或常量被用於查詢索引列上的值

rows:根據表統計資訊及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數

extra:包含不適合在其他列中顯示但十分重要的額外資訊

全值匹配我最愛

最佳左字首法則-如果索引了多例,要遵守最左字首法則。指的是查詢從索引的最左前列開始並且不跳過索引中的列。(例如復合索引中,第乙個索引欄位沒被使用,則後面的也不會被使用)

不在索引列上做任何操作(計算、函式、(自動or手動)型別轉換),會導致索引失效而轉向全表掃瞄

儲存引擎不能使用索引中範圍條件右邊的列

盡量使用覆蓋索引(只訪問索引列的查詢(索引列和查詢列一致)),減少select*

mysql在使用不等於(!=或者<>)的時候無法使用索引會導致全表掃瞄

is null,is not null 也無法使用索引

like以萬用字元開頭(』$abc…』)mysql索引失效會變成全表掃瞄操作

字串不加單引號索引失效

少用or,用它連線時會索引失效

單路排序

結論延申出的問題

2)嘗試提高 short_buffer_ size

不管用那種演算法,提高這個引數,都會提高效率,當然,要根據系統能力去提高,因為這個引數是針對每個程序。

3)嘗試 提高 max_length_for_short_data

提高這個引數,會增加使用改進演算法的概率。但是如果設定太高,資料總量超出 short_buffer_ size 的概率增大,明顯症狀高的io活動和低的處理器使用率。

檢視:

show variables like

'%slow_query_log%'

開啟:

set

global slow_query_log =

1

檢視慢sql的時間閾值:

show variables like

'long_query_time%'

;

設定慢sql的時間閾值:

set

global long_query_time=

3;

使用配置檔案如下:

slow_query_log=1;

slow_query_log_file=/var/lib/mysql/slow.log

long_query_time=3;

log_output=file

特點:

偏向myisam儲存引擎,開銷小,加鎖快,無死鎖,鎖定粒度大,發生鎖衝突的概率最高,併發最低

加讀鎖:

lock

table

### read

.加寫鎖:

lock

table

### write

表鎖分析:

總結:簡而言之就是讀鎖會阻塞寫,但不會阻塞讀;而寫鎖會把讀和寫阻塞。

特點偏向innodb儲存引擎,開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。innodb與myisam的最大不同有兩點:一是支援事務(transaction);二是採用了行級鎖

事物的隔離級別

無索引行鎖公升級為表鎖

varchar 不用 』 』 導致系統自動轉換型別, 行鎖變表鎖

間隙鎖當我們使用範圍條件而不是相等條件檢索資料,並請求共享或排它鎖時,innodb會給符合條件的已有資料記錄的索引項加鎖;對於鍵值在條件範圍內但並不存在的記錄叫做「間隙」,innodb也會對這個「間隙」加鎖,這種鎖機制就叫間隙鎖。

危害:在執行過程中通過範圍查詢的話,他會鎖定整個範圍內所有的索引鍵值,即使這個鍵值不存在。

如何鎖定一行

使用 select ** for update;使用之後其他操作會被阻塞,直到鎖定的行會話提交 commit。

優化建議

組成部分:

btree索引(或balanced tree),是一種很普遍的資料庫索引結構,。其特點是定位高效、利用率高、自我平衡,特別適用於高基數字段,定位單條或小範圍資料非常高效。理論上,使用btree在億條資料與100條資料中定位記錄的花銷相同。

若差找的資料是29,首先會將磁碟塊1載入到記憶體中,此時發生一次io,在記憶體中使用二分查詢定誒29在17和35之間,鎖定磁碟塊1的p2指標沒通過這個指標的磁碟位址將磁碟塊3載入到記憶體,發生第二次io,同樣根據二分查詢定位資料在磁碟塊3的p2指標,通過指標載入磁碟塊8到記憶體中,發生第三次io,同時使用而分查詢找到29,結束查詢,總計三次io。

b樹和b+樹的最大區別在於非葉子節點是否儲存資料的問題。

mysql 效能分析 Mysql效能分析

優化mysql資料庫效能的十個引數 1 max connections 允許的同時客戶的數量。增加該值增加 mysqld 要求的檔案描述符的數量。這個數字應該增加,否則,你將經常看到 too many connections 錯誤。預設數值是100,我把它改為1024 2 record buffer...

mysql高效能索引 mysql高效能索引( )

在開發中,我們知道大多數應用的瓶頸在於sql語句的執行時耗,在這裡並不討論sql語句的安全,僅僅討論高效能sql語句,而與高效能sql語句緊密相連的就是傳說中的 索引。索引 一種工作在儲存引擎端的用於快速找到記錄的一種資料結構。mysql使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...

mysql效能分析與優化

hash索引的限制 hash索引必須進行二次查詢 hash索引無法用於排序 hash索引不支援部分索引查詢,也不支援範圍查詢 hash索引中hash碼的計算可能存在hash衝突 為什麼要使用索引 索引大大減少了儲存引擎需要掃瞄的資料量 索引可以幫助我們進行排序以避免使用臨時表 索引可以把隨機i o變...