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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時間:2025/3/20 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql索引查2遍_mysql索引优化查询 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一:mysql的引擎簡介。

1、ISAM:查找速度快,不支持事物,如果硬盤崩潰則無法恢復(fù)。

2、MyISAM:是ISAM的擴(kuò)展,在web中用的很多,讀取速度快,,不支持事物。

3、InnoDB:InnoDB:支持事物,但是速度比ISAM和MyISAM慢,穩(wěn)定可靠性高

查看當(dāng)前數(shù)據(jù)庫默認(rèn)引擎,可以看到本人用的是InnoDB;

二:mysql索引簡介

1、普通索引

創(chuàng)建和刪除

create index index_myIndex_name on myIndex(name(5));

drop index index_myIndex_name on myIndex;

name(5)標(biāo)示若那么字段過長則可以,將字段全部拿出來做索引很浪費(fèi)空間,此處拿出該字段的前5個字符作為索引,那么這個5的數(shù)字怎么確定呢?

此處標(biāo)示name的前五個字符的辨識度達(dá)到99.54%,前四個只有85.30。這里我們選擇前五個字符來創(chuàng)建作為索引。此類索引也可以稱之為前綴索引

2、唯一索引

索引列的值必須唯一,但允許空值。

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

3、主鍵索引

主鍵索引mysql默認(rèn)都會創(chuàng)建,若數(shù)據(jù)庫引擎用的是InnoDB,則若無特許情況請用mysql的自增的id作為主鍵。因為InnoDB引擎的數(shù)據(jù)存儲是根據(jù)主鍵分頁存儲,若用自增的id作為主鍵可以按順序往下自動存儲,否則在存儲時為了保證page結(jié)構(gòu)會有不斷的插入移動操作,導(dǎo)致消耗數(shù)據(jù)庫性能。

4、組合索引

create index unindex_myIndex_age_info on myIndex(age, info(5));

組合遵循前綴規(guī)則,如上創(chuàng)建的age,info的組合索引,則實際上的是【age】,【age,info】這兩對組合索引,我們觀察到?jīng)]有【info】這個組合索引,這就是組合索引的前綴規(guī)則。如果我們建的是age,info,name這三個的組合索引則實際上創(chuàng)建的是【age】,【age,info】,【age,info,name】這三組組合索引。

組合索引的應(yīng)用場景:如果你經(jīng)常用到age或者【age,info】這樣的條件來查詢,則組合索引比單列索引效率更優(yōu)。若你只是大部分情況都是單獨(dú)以age和info作為查詢條件則可選擇單列索引效果更好。但需要注意的是這里的條件是and語句,or語句是不會用到索引的(某些情況下mysql的執(zhí)行優(yōu)化會將其轉(zhuǎn)化為union all語句則可以用到兩個單列索引)。如果or語句的條件一個有索引另一個無索引則肯定會全表查詢。

三:mysql用索引來優(yōu)化sql查找使用注意點

在進(jìn)行測試之前首先關(guān)閉mysql的查詢緩存

set?session?query_cache_type=off;

查看該表所有的索引

1、不要在列上使用函數(shù)或計算:

以上兩條sql得到的效果一樣但是效率差距巨大,因為上面的那個是age/2=12,這里進(jìn)行的是全表掃描,下面的使用了索引。

2、在使用多條件查找時,and語句時候盡量使用組合索引。

查看該表的所有索引可以看到【age,info】是一組組合索引,age,name分別有一個單列索引,下面我們來試驗:

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

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

下面我們用explain關(guān)鍵字

上面可以看到前者的rows10656后者則為140,rows表示該sql遍歷的函數(shù),越少越好。很明顯后者要少很多。再看用到的索引key關(guān)鍵字,前者用到的是unindex_myIndex_age_info,后者也是。但是我們前面說到了【age,info】這組索引實際上是創(chuàng)建了【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創(chuàng)建了單列索引了的。答案是:mysql對一個select語句只會選擇一個它認(rèn)為最優(yōu)的一個索引。從上面的例子也能看出來這點。但是or語句會有執(zhí)行引擎將其優(yōu)化成union all,會用到兩個索引,這里下面再講。

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

其實這點很好理解,or語句如果每列都有索引的話mysql執(zhí)行優(yōu)化會將其轉(zhuǎn)化為union all語句(因為我們前面說過每個select語句只能選擇一個索引執(zhí)行,索引要轉(zhuǎn)為union all這樣就能用到多個索引),這樣就會執(zhí)行索引。但是如果其中一列沒有索引則這列也就需要全表掃描,既然是全表掃描,其他列的索引也就無用了,mysql也就不會執(zhí)行優(yōu)化將其改成union all因為這樣做一點用都沒有,反正都要全表掃描。

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

先看看效果差別

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

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

只要列中包含有NULL值都將不會被包含在索引中,復(fù)合索引中只要有一列含有NULL值,那么這一列對于此復(fù)合索引就是無效的。所以我們在數(shù)據(jù)庫設(shè)計時不要讓字段的默認(rèn)值為NULL。

6、使用短索引

對串列進(jìn)行索引,如果可能應(yīng)該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字符內(nèi),多數(shù)值是惟一的,那么就不要對整個列進(jìn)行索引。短索引不僅可以提高查詢速度而且可以節(jié)省磁盤空間和I/O操作。

四:使用索引的

索引可用但不是處處可用,在使用索引時候我們需要評估是否需要。

首先數(shù)據(jù)量比較小的情況我們不需要使用索引,創(chuàng)建索引是需要消耗硬盤資源的。

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

如果一列數(shù)據(jù)量太大比如這里的info varchar(1000)可以用短索引。

主鍵用自增的id作為索引。

總結(jié)

以上是生活随笔為你收集整理的mysql索引查2遍_mysql索引优化查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。