日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

mysql索引查2遍_mysql索引优化查询

發布時間:2025/3/20 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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索引优化查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。