mysql索引及優化

2021-10-21 10:29:04 字數 2329 閱讀 3359

mysql的索引可以從不同的維度來進行區分,如下:

這是最基本的索引型別,基於普通字段建立的索引,沒有任何限制。

與"普通索引"類似,不同的就是:索引欄位的值必須唯一,但允許有空值 。在建立或修改表時追加唯一

約束,就會自動建立對應的唯一索引。

它是一種特殊的唯一索引,不允許有空值。在建立或修改表時追加主鍵約束即可,每個表只能有乙個主

鍵。使用者可以在多個列上建立索引,這種索引叫做組復合索引(組合索引)。復合索引可以代替多個單一索引,相比多個單一索引復合

索引所需的開銷更小。

如果使用全文索引,查詢速度會比like快很多倍。(mysql5.6之前只有myisam引擎支援,5.6之後innodb支援)

索引涉及的理論知識:二分查詢,hash和b tree。 這裡我們不討論二分查詢,來分析一下hash和b tree

hash底層實現是由hash表來實現的,是根據鍵值 儲存資料的結構。非常適合根據key查詢value值,也就是單個key查詢,或者說等值查詢(此時的時間複雜度最好可以達到o(1)),但是對於範圍查詢, 就需要全表掃瞄了。其結構如下所示:

hash索引在mysql中hash結構主要應用在innodb自適應雜湊索引。

innodb自適應雜湊索引是為了提公升查詢效率,innodb儲存引擎會監控表上各個索引頁的查詢,當

innodb注意到某些索引值訪問非常頻繁時,會在記憶體中基於b+tree索引再建立乙個雜湊索引,使得記憶體中的 b+tree 索引具備雜湊索引的功能,即能夠快速定值訪問頻繁訪問的索引頁。

mysql採用的是b+tree結構, 是對btree結構上做了優化

btree的搜尋是採用二分查詢。

相當於btree,在進行範圍查詢時,只需要查詢定位2個節點的索引值,然後利用葉子節點的指標進行遍歷即可。

主要檢視以下這幾個字段

屬性名屬性解釋

建議type

連線型別

至少要達到range級別。杜絕出現all, index

key使用到的索引名

如果沒有選擇索引,值是null。可以採取強制索引方式

key_len

索引長度

rows

掃瞄行數

extra

詳細說明

常見的不太友好的值,如下:using filesort,using temporary

mysql對於in做了優化,會把in中的資料全部儲存在乙個陣列裡面,而且這個陣列是會拍好序的,如果數值過多,消耗也會過大。建議值在1000以內。

select * 會增加多餘的消耗(cpu ,io,記憶體,網路頻寬),減少了使用覆蓋索引的可能性。

limit是可以停止全表掃瞄

order by 後面的字段加索引, 可以消除extra中的using filesort, 如果可以的話, 可以和查詢條件一起加乙個復合索引。

or兩邊的字段中,如果有乙個不是索引字段,會造成該查詢不走索引的情況。

union和union all的差異主要是前者需要將結果集合並後再進行唯一性過濾操作,這就會涉及到排序,

增加大量的cpu運算,加大資源消耗及延遲。當然,union all的前提條件是兩個結果集沒有重複資料。

order by 後面使用 rand()函式, 會不走索引

區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為

驅動表,先被訪問,如果是in,那麼先執行子查詢。所以in適合於外表大而內錶小的情況;exists適合

於外表小而內錶大的情況。

分頁使用 limit m,n 盡量讓m 小, 如果m足夠大, 就會走出查詢效率降低即使有索引的存在下,可以先使用id定位到m記錄之前來消除m過大的問題。

如果查詢的範圍過大的話, 需要把這條語句查詢的結果分為幾次查詢。 主要是不要讓一條sql語句掃瞄表記錄過多。

使用%開頭, 就會使得索引失效

會使得索引失效

比如乙個欄位為int型, 寫入sql語句時, 明確為where aa=111 而表示aa=『111』

比如有個符合索引(a,b,c) 如果條件出現》,2 and c=3, 此時只會用到索引(a)

有時候一條sql語句經過mysql查詢優化之後, 不會走索引, 可以在sql語句後面加上force index來強制走索引

left join a表為驅動表,inner join mysql會自動找出那個資料少的表作用驅動表,right join b表為驅動表。

當你不太清楚, 應該哪張表為驅動表時, 可以使用inner join來進行sql查詢, 讓mysql自動幫你選擇。總而言之,就是使用join時, 需要讓小表來驅動大表

Mysql 索引及優化

索引是什麼?相信大家都用過字典。你是怎麼從厚厚的新華字典中找到你需要找到的那個字的呢?又是怎麼從一本書中快速定位到你需要的章節?我們都是通過書中的目錄,然後根據目錄中的頁碼定位到我們要的資訊。同樣在mysql中也是這樣為我們準備了乙份目錄。當你去通過sql語句查詢的時候用不用索引,以及怎麼用索引。決...

MySQL優化(三) 索引原理及索引優化

b tree索引,它是目前關係型資料庫中查詢資料最為常用和有效的索引,大多數儲存引擎都支援這種索引。使用b tree這個術語,是因為mysql在create table或其它語句中使用了這個關鍵字,但實際上不同的儲存引擎可能使用不同的資料結構,比如innodb就是使用的b tree。中的b是指bal...

MySQL索引建立及優化

聯合索引中 索引建立在離散度大的字段上面 離散度指利用count distinct 獲取欄位的唯一值,唯一值越多的離散度越大 索引的優化 重複及冗餘索引 重複索引 指相同的列以相同的順序建立的同型別的索引,如下表 create table if not exists test id smallint...