建立一張表,包含三個字段。
三個欄位都是varchar型別的。並且給三個欄位做了組合索引
接下來就是驗證索引是否生效了
1.查詢全部記錄
explain select * from `handler`;
結果為
可以看到 type為all ,這便是所謂的「全表掃瞄」,如果是展示乙個資料表中的全部資料項,倒是覺得也沒什麼,如果是在乙個查詢資料項的sql**現了all型別,那通常意味著你的sql語句處於一種最原生的狀態,有很大的優化空間。
為什麼這麼說呢?因為all是一種非常暴力和原始的查詢方法,非常的耗時而且低效。用all去查詢資料就好比這樣的乙個情形:s學校有倆萬人,我告訴你你給我找到小明,然後你怎麼做呢!你當然是把全校倆萬人挨個找一遍,即使你很幸運第乙個人便找到了小明,但是你仍然不能停下,因為你無法確認是否有另外乙個小明存在,直到你把倆萬人找完為止。所以,基本所有情況,我們都要避免這樣型別的查詢,除非你不得不這樣做。
2.使用乙個索引,且使用僅使用組合索引的第乙個索引
explain select * from `handler` where taskid = '1';
結果為
可以看到他使用了乙個索引,key_len用於表示本次查詢中,所選擇的索引長度有多少位元組,通常我們可藉此判斷聯合索引有多少列被選擇了。
3.使用兩個索引,索引順序按照組合索引
explain select * from `handler` where taskid = '1' and file_url = 'b';
結果為
可以看到使用了兩個索引,且key_len也變大了。
4.使用全部索引,且按照組合索引順序
explain select * from `handler` where taskid = '1' and file_url = 'b' and file_md5 = 'bm';
結果為
很明顯的看到key_len又增大了,因此全部的索引是生效的。
5.欄位型別對索引的影響
explain select * from `handler` where taskid = 1;
結果為
可以看到type為all,rows欄位表示可能掃瞄的行,因為我們的表的資料量只有三行,但是全部掃瞄了,因此判定當資料型別不一致的時候索引是不生效的
6.條件順序對索引是否有影響
explain select * from `handler` where file_url = 'b' and file_md5 = 'bm' and taskid = '1';
結果為
可以看到儘管我們的where條件順序與組合索引的順序不一致,但組合索引還是生效了,而且是寫在where中的索引都生效了
7.索引跳躍是否有影響
explain select * from `handler` where taskid = '1' and file_md5 = 'bm';
explain select * from `handler` where file_url = 'b' and file_md5 = 'bm';
結果為
可以看到第一條sql使用乙個索引,由於中間缺少了 file_url 字段,因此file_md5的索引是不生效的.因此只使用了乙個索引
而第二條sql則是全表掃瞄。為什麼呢,因為它缺少了 taskid,而taskid是組合索引的第乙個索引,因此索引乙個也沒有生效,這或許是最左字首原則的最好說明。
8.範圍查詢是否影響索引
explain select * from `handler` where taskid = '1' and file_url = 'b' and file_md5 > 'cm';
結果為
同樣的三個索引都生效了。
9.當sql**現不等於
explain select * from `handler` where taskid = '1' and file_url = 'b' and file_md5 != 'cm';
explain select * from `handler` where taskid != '2' and file_url = 'b' and file_md5 = 'cm';
結果為
可以發現不管 != 出現在哪個位置,都會導致索引失效,從而造成全表掃瞄
在使用組合索引時,要盡量保證字段型別一致。同時不要跳躍索引,比如 組合索引為 abcd 而實際sql為 where a c d 那麼cd索引將不會生效。但是 如果是 where dcba 則索引是生效的。另外不要對索引字段使用 != 來判斷,否則會導致全部索引失效。
本實踐基於:
MySql最左字首原則
企業的筆試題,對資料庫這塊了解很淺,所以還是記錄一下吧。b tree 索引和 hash 索引的對比 對於 b tree 和 hash 資料結構的理解能夠有助於 不同儲存引擎下使用不同索引的查詢效能的差異,尤其是那些允許你選擇 b tree 或者 hash 索引的記憶體儲存引擎。b tree 索引的特...
MySql最左字首原則
最左字首原則 通過例項理解單列索引 多列索引以及最左字首原則 例項 現在我們想查出滿足以下條件的使用者id mysql select uid from people where lname liu and fname zhiqun and age 26 因為我們不想掃瞄整表,故考慮用索引。單列索引 ...
mysql最左字首原則
假設資料 表 t a,b,c rowid 為物理位置 rowid a b c 1 111 2 2 113 3 2214 4 1 33 5 2312 6 1 25 7 239 8 1 22 9 136 10 2 211 11 228 12 1 17 13 2315 14 1 14 15 2110 當你...