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...