mysql索引優化查詢

一:mysql的引擎簡介。

一、ISAM:查找速度快,不支持事物,若是硬盤崩潰則沒法恢復。mysql

二、MyISAM:是ISAM的擴展,在web中用的不少,讀取速度快,,不支持事物。web

三、InnoDB:InnoDB:支持事物,可是速度比ISAM和MyISAM慢,穩定可靠性高sql

查看當前數據庫默認引擎,能夠看到本人用的是InnoDB;數據庫

二:mysql索引簡介

一、普通索引緩存

    建立和刪除session

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。這裏咱們選擇前五個字符來建立做爲索引。此類索引也能夠稱之爲前綴索引函數

二、惟一索引性能

    索引列的值必須惟一,但容許空值。mysql索引

create unique index indexName on myIndex(username(lenght))

三、主鍵索引

    主鍵索引mysql默認都會建立,若數據庫引擎用的是InnoDB,則若無特許狀況請用mysql的自增的id做爲主鍵。由於InnoDB引擎的數據存儲是根據主鍵分頁存儲,若用自增的id做爲主鍵能夠按順序往下自動存儲,不然在存儲時爲了保證page結構會有不斷的插入移動操做,致使消耗數據庫性能。

四、組合索引

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;

查看該表全部的索引

一、不要在列上使用函數或計算:

以上兩條sql獲得的效果同樣可是效率差距巨大,由於上面的那個是age/2=12,這裏進行的是全表掃描,下面的使用了索引。

二、在使用多條件查找時,and語句時候儘可能使用組合索引。

    查看該表的全部索引能夠看到【age,info】是一組組合索引,age,name分別有一個單列索引,下面咱們來試驗:

這是組合索引的查找速率。

這是兩個單列索引的查找速率。能夠看到明顯在這種狀況下組合索引效率要高。

下面咱們用explain關鍵字

上面能夠看到前者的rows 10656後者則爲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,會用到兩個索引,這裏下面再講。

三、or語句的列都要使用單列索引,若是有一列沒有索引就是全表查詢。

    其實這點很好理解,or語句若是每列都有索引的話mysql執行優化會將其轉化爲union all語句(由於咱們前面說過每一個select語句只能選擇一個索引執行,索引要轉爲union all這樣就能用到多個索引),這樣就會執行索引。可是若是其中一列沒有索引則這列也就須要全表掃描,既然是全表掃描,其餘列的索引也就無用了,mysql也就不會執行優化將其改爲union all由於這樣作一點用都沒有,反正都要全表掃描。

四、like語句不要將通配符%放在最前面

    先看看效果差異

    效率差距是巨大的,like語句通配符%在最前面,sql查詢時候會放棄索引,進行全表掃描。

五、索引不會包含有NULL值的列

    只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。因此咱們在數據庫設計時不要讓字段的默認值爲NULL。

六、使用短索引

    對串列進行索引,若是可能應該指定一個前綴長度。例如,若是有一個CHAR(255)的列,若是在前10個或20個字符內,多數值是唯一的,那麼就不要對整個列進行索引。短索引不只能夠提升查詢速度並且能夠節省磁盤空間和I/O操做。

 

四:使用索引的

索引可用但不是到處可用,在使用索引時候咱們須要評估是否須要。

首先數據量比較小的狀況咱們不須要使用索引,建立索引是須要消耗硬盤資源的。

組合條件查詢多要用組合索引。

若是一列數據量太大好比這裏的info varchar(1000)能夠用短索引。

主鍵用自增的id做爲索引。

相關文章
相關標籤/搜索