mysql索引注意事項

2021-08-20 18:05:50 字數 2352 閱讀 9575

1.模糊查詢前導不會走索引

select id,user_name,price_code from user_activity_info where user_name like '%zhang';
如果非要使用前導索引的話可以借助apache的lucence索引工具

2.欄位預設值不要設定成null

如果可以請設定為 not null

3.不要在sql中對字段進行計算,這樣會使索引失效

select user_name,price_code,create_time from user_activity_info where from_unixtime(create_time) > now();
4.不要對欄位進行隱式轉換

select user_name,price_code,create_time from user_activity_info where user_name=12345;
user_name是varchar型別,但是檢索匹配值卻是int型12345,這樣會使user_name的索引失效

5.復合索引類的第乙個欄位列必須出現在條件中,復合索引中區分度高的要放在第一列

select id,user_name,price_code,create_time from user_activity_info where user_name="simons";
price_code和user_name是聯合索引,但是where條件中只有user_name,且user_name是聯合索引的第二列,所以這個sql不會命中索引

6.篩選後的資料只有一條也得加上limit 1

select id,user_name,price_code,create_time from user_activity_info where id='256' limit 1;
這樣也可以提高sql效率,減少資料庫游標移動

7.不要在低基數列上建索引,如性別字段,"牆裂"建議在區分度高的字段上建索引

例如性別字段,值只有男或女,區分度低,mysql會認為直接掃瞄全表資料比掃瞄索引快一些,所以不會使用索引

8.負向查詢不會使用索引,會導致全表掃瞄

select id,user_name,price_code,create_time from user_activity_info where id not in('1','5');
9.join查詢列欄位最好相同,否則可能導致發生隱式轉換,不命中索引

select a.user_name,b.price_code,create_time from user_activity_info a join reward_info b on a.price_code=b.price_code;
user_activity_info和reward_info表中的price_code欄位型別要一致

10.通過延遲關聯(覆蓋索引查詢返回需要的主鍵,再根據主鍵關聯原表獲取所需資料)的方式

通過使用覆蓋索引查詢返回需要的主鍵,再根據主鍵關聯原表獲得需要的資料,而不是通過二級索引獲取主鍵再通過主鍵去遍歷資料頁。例如存在這麼一條sql:

explain select id,actid,kbid,phaseid,security_code,code,validdays,enddate,status,vip_type,createtime 

from suning_act_card where status ='0' and createtime >='2014-05-29' order by id asc limit 2638327 ,20;

表資料量為4千萬左右,根據上面的原則,可以改寫為:

explain select a.* from suning_act_card a, (select id from suning_act_card where status ='0' and createtime >='2014-05-29'

order by id asc limit 2638327 ,20 ) b where a.id=b.id;

測試結果是執行速度提公升了12%左右,且隨著表資料量的增加提公升效率越來越明顯。看官可親測下!!!

引申閱讀:mysql開發規範

mysql索引注意事項

在查詢條件中必須有復合索引還中最左側的列 在建立多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊 假設你在表的state city和zip資料列上建立了復合索引。索引中的資料行按照state city zip次序排列,因此它們也會自動地按照state city和state次序排...

mysql復合索引注意事項

概念 單一索引是指索引列為一列的情況,即新建索引的語句只實施在一列上 使用者可以在多個列上建立索引,這種索引叫做復合索引 組合索引 復合索引在資料庫操作期間所需的開銷更小,可以代替多個單一索引 同時有兩個概念叫做窄索引和寬索引,窄索引是指索引列為1 2列的索引,寬索引也就是索引列超過2列的索引 設計...

mysql索引 使用注意事項

索引使用缺點 雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行insert,update和delete。因為更新表時,mysql不僅要儲存資料,還要儲存一下索引檔案 建立索引會占用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在要給大表上建了多種組合索引,索引檔案會膨脹很寬 ...