mysql索引查2遍_mysql索引优化查询
一:mysql的引擎簡介。
1、ISAM:查找速度快,不支持事物,如果硬盤崩潰則無法恢復。
2、MyISAM:是ISAM的擴展,在web中用的很多,讀取速度快,,不支持事物。
3、InnoDB:InnoDB:支持事物,但是速度比ISAM和MyISAM慢,穩定可靠性高
查看當前數據庫默認引擎,可以看到本人用的是InnoDB;
二:mysql索引簡介
1、普通索引
創建和刪除
create index index_myIndex_name on myIndex(name(5));
drop index index_myIndex_name on myIndex;
name(5)標示若那么字段過長則可以,將字段全部拿出來做索引很浪費空間,此處拿出該字段的前5個字符作為索引,那么這個5的數字怎么確定呢?
此處標示name的前五個字符的辨識度達到99.54%,前四個只有85.30。這里我們選擇前五個字符來創建作為索引。此類索引也可以稱之為前綴索引
2、唯一索引
索引列的值必須唯一,但允許空值。
create unique index indexName on myIndex(username(lenght))
3、主鍵索引
主鍵索引mysql默認都會創建,若數據庫引擎用的是InnoDB,則若無特許情況請用mysql的自增的id作為主鍵。因為InnoDB引擎的數據存儲是根據主鍵分頁存儲,若用自增的id作為主鍵可以按順序往下自動存儲,否則在存儲時為了保證page結構會有不斷的插入移動操作,導致消耗數據庫性能。
4、組合索引
create index unindex_myIndex_age_info on myIndex(age, info(5));
組合遵循前綴規則,如上創建的age,info的組合索引,則實際上的是【age】,【age,info】這兩對組合索引,我們觀察到沒有【info】這個組合索引,這就是組合索引的前綴規則。如果我們建的是age,info,name這三個的組合索引則實際上創建的是【age】,【age,info】,【age,info,name】這三組組合索引。
組合索引的應用場景:如果你經常用到age或者【age,info】這樣的條件來查詢,則組合索引比單列索引效率更優。若你只是大部分情況都是單獨以age和info作為查詢條件則可選擇單列索引效果更好。但需要注意的是這里的條件是and語句,or語句是不會用到索引的(某些情況下mysql的執行優化會將其轉化為union all語句則可以用到兩個單列索引)。如果or語句的條件一個有索引另一個無索引則肯定會全表查詢。
三:mysql用索引來優化sql查找使用注意點
在進行測試之前首先關閉mysql的查詢緩存
set?session?query_cache_type=off;
查看該表所有的索引
1、不要在列上使用函數或計算:
以上兩條sql得到的效果一樣但是效率差距巨大,因為上面的那個是age/2=12,這里進行的是全表掃描,下面的使用了索引。
2、在使用多條件查找時,and語句時候盡量使用組合索引。
查看該表的所有索引可以看到【age,info】是一組組合索引,age,name分別有一個單列索引,下面我們來試驗:
這是組合索引的查找速率。
這是兩個單列索引的查找速率??梢钥吹矫黠@在這種情況下組合索引效率要高。
下面我們用explain關鍵字
上面可以看到前者的rows10656后者則為140,rows表示該sql遍歷的函數,越少越好。很明顯后者要少很多。再看用到的索引key關鍵字,前者用到的是unindex_myIndex_age_info,后者也是。但是我們前面說到了【age,info】這組索引實際上是創建了【age】,【age,info】這兩組索引。前者的條件為age=12*2 and name like ‘k%’,前者等價于用到的是組合索引的【age】單列索引。而后者的條件是age =12*2 and info like ‘k%’用的是組合索引【age,info】這個組合索引故而速度要快很多。
有人會疑惑為什么age=12*2 and name like 'k%'沒有條用name的索引,通過前面我們能看到我也為name創建了單列索引了的。答案是:mysql對一個select語句只會選擇一個它認為最優的一個索引。從上面的例子也能看出來這點。但是or語句會有執行引擎將其優化成union all,會用到兩個索引,這里下面再講。
3、or語句的列都要使用單列索引,如果有一列沒有索引就是全表查詢。
其實這點很好理解,or語句如果每列都有索引的話mysql執行優化會將其轉化為union all語句(因為我們前面說過每個select語句只能選擇一個索引執行,索引要轉為union all這樣就能用到多個索引),這樣就會執行索引。但是如果其中一列沒有索引則這列也就需要全表掃描,既然是全表掃描,其他列的索引也就無用了,mysql也就不會執行優化將其改成union all因為這樣做一點用都沒有,反正都要全表掃描。
4、like語句不要將通配符%放在最前面
先看看效果差別
效率差距是巨大的,like語句通配符%在最前面,sql查詢時候會放棄索引,進行全表掃描。
5、索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,復合索引中只要有一列含有NULL值,那么這一列對于此復合索引就是無效的。所以我們在數據庫設計時不要讓字段的默認值為NULL。
6、使用短索引
對串列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字符內,多數值是惟一的,那么就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作。
四:使用索引的
索引可用但不是處處可用,在使用索引時候我們需要評估是否需要。
首先數據量比較小的情況我們不需要使用索引,創建索引是需要消耗硬盤資源的。
組合條件查詢多要用組合索引。
如果一列數據量太大比如這里的info varchar(1000)可以用短索引。
主鍵用自增的id作為索引。
總結
以上是生活随笔為你收集整理的mysql索引查2遍_mysql索引优化查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yii mysql 2002_YII 错
- 下一篇: php mysql记录用户行为_PHP实