《Mysql入門MySQL InnoDB索引介紹及優化(二)》要點:
本文介紹了Mysql入門MySQL InnoDB索引介紹及優化(二),希望對您有用。如果有疑問,可以聯系我們。
導讀:MySQL InnoDB索引介紹及優化(二)
八、再來看看如何在長字段上建立索引呢
首先,在較長的字段上建立索引是非常影響性能的,比如文章等超大varchar或者text字段,如果不是非建不可,一般不推薦,另外對InnoDB索引單字段(utf8)只能取前767bytes
那么如何處理長字段索引?
主要根據類型來分別處理:
1、Email類,可以建立前綴索引
mail_addr varchar(2048)
idx_mailadd(mail_addr(39))?? -> 正確
解析:由于email郵件類型字段,一般后綴都有較大可能相同,如.com .cn等等,而前綴相同的可能性較低,且郵箱一般長度較短,因此可以建立前綴索引
2、住址類,分拆字段
home_addr varchar(2048)
idx_homeadd(home_addr(30))??? ->錯誤,很可能前半段是相同的省市區街道名
province_add varchar(1024),city_add varchar(1024), district_add `varchar(1024),lolcal_add varchar(1024)??? --建立聯合索引或者單列索引 ->正確`
九、對核心SQL索引做覆蓋掃描
對于最核心的SQL,我們可以考慮使用索引覆蓋,什么是索引覆蓋呢,下面是個例子
select name from tb_user where userid=?
key idx_uid_name(userid,name)?? ->覆蓋索引掃描
我們查詢用戶名這種操作頻率非常高,而索引里面又存儲了字段的值,因此在我們做查詢時,name字段的值直接在索引中返回,而不需要回表;還有一個使用非常廣泛的例子:用戶登陸,我們可以將username password做覆蓋索引,這樣大大提高登陸驗證的速度
因此覆蓋索引覆蓋就是將你要查詢的字段和條件字段一起建立聯合索引,這樣的好處是不需要回表獲取name字段,IO最小,速度塊
十、哪些情況無法使用索引?
1、索引列進行數據運算或者函數運算
eg:
?? where id+1=10;??? ->錯誤,無法利用到索引
?? where id=(10-1)?? ->正確
?? where year(id) < 2016????? ->錯誤,無法利用到索引
?? where col < '2016-01-01'?? ->正確
2、未含復合索引的前綴字段
idx_abc(a,b,c)
where b=? and c=??? ->錯誤,無法利用到索引
正確的建立索引方式(b,c)
3、前綴通配符"_" "%"等
like '%ttt%'?? ->錯誤,無法利用到索引
like "ttt%"??? ->正確
4、where條件使用NOT,<>,!= 通常也無法使用到索引
5、字段類型不匹配
字段類型并不絕對匹配時,可能會導致無法使用索引
a int(11) ,idx_a(a)
where a = '123'?? ->錯誤,可能導致未知的錯誤,這個跟編碼有關系
where a = 123???? ->正確
十一、利用索引做排序操作
以 idx_ab(a,b)索引為例
1、能使用上述索引進行排序的操作是:
order by a;
a = 3 order by b;
order by a,b;
order by a desc ,b desc;
a > 5 order by a;
2、不能使用索引幫助排序的查詢
order by b; #沒有使用到聯合索引的第一個字段
a > 5 order by b;? #一旦前綴操作是一個range而非=操作,那么就無法利用到索引,
這里 a>5無法利用索引,二聯合索引的第一個字段未利用,
因此 order by b也無法利用索引查詢
a in (1,3) order by b; #in里面的值沒有建立索引,因此無法利用索引,a未用因此order by b也無法使用
order by a asc, b desc; #這里order by a esc是利用了索引,但是b desc未利用到,因為b要和a排序方式一致才可利用到索引
十二、如何確定一個查詢有沒有走索引,走了哪些索引?
MySQL中自帶命令行工具 explain 來查看一個sql語句是否了索引
使用方式:
explain select * from tb_test;
關注的項:
1、type : 查詢access的方式,表的連接類型
?????
????? index |? 索引?
????? full? |? 全表掃描
????? ref?? |? 參照查詢,也就是等值查詢?
????? range |? 范圍查詢
2、key? : 本次查詢最終選擇使用哪個索引,NULL為未使用索引
3、key_len : 選擇的索引使用的前綴長度或者整個長度
4、rows??? : 查詢邏輯掃描過的記錄行數
5、extra?? : 額外信息,主要是指fetch data的具體方式
總結:索引的本質還是提升我們查詢數據庫的速度,減少服務器I/O開銷,提供更穩定快捷的服務
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/5799.html