mysql怎么查索引失效 mysql如何查詢索引

Mysql索引失效的底層原理

1.索引失效的原因

創(chuàng)新互聯(lián)主營澄邁網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā)公司,澄邁h5小程序定制開發(fā)搭建,澄邁網(wǎng)站營銷推廣歡迎澄邁等地區(qū)企業(yè)咨詢

聯(lián)合索引排序的原理:先對(duì)第一個(gè)字段進(jìn)行排序,在第一個(gè)字段相同的情況下考慮第二個(gè)字段,然后在第二個(gè)字段相同的情況下才考慮第三個(gè)字段...

CREATE TABLE 'test_user'(

'id' int(11) not null auto_increment comment '主鍵id',

‘user_id’ varchar(36) not null comment '用戶id',

'phone' varchar(20) not null comment '用戶名稱',

'lan_id' int(9) not null comment '本地網(wǎng)',

'region_id' int(9) not null comment '區(qū)域'

)ENGINE=InnoDB Auto_increment=4057960 Default charset=utf8mb4;

假設(shè)將('phone', 'lan_id', 'region_id')組成的聯(lián)合索引

Explain select * from test_user where lan_id = 1;

此時(shí)的索引是失效的,因?yàn)槁?lián)合索引是遵循最左前綴法則即第一個(gè)字段有序的情況下lan_id才有序?,F(xiàn)在是跳過phone,直接搜索lan_id相當(dāng)于在一個(gè)無序的B+樹上搜索,所以只能全表掃描。

例1下例范圍查找的右邊索引會(huì)失效

Explain select * from test_user where a 1 and b = 1;

為什么索引會(huì)失效?

因?yàn)槲覀兛梢哉业絘 1的所有的節(jié)點(diǎn),但是此時(shí)的b索引是無序的,仍然不可以通過二分查找法來查找

例2. like查詢中,如果%放在兩邊或者放到左邊,它都是不走索引的。只有%放到右邊,它某些情況才會(huì)走這個(gè)索引。這是什么原因?

字符串在B+樹里面存儲(chǔ)的時(shí)候,它也是按照字母的大小去排序。首先按照第一個(gè)字母去比較,如果第一個(gè)字母相同則按照第二個(gè)字母去比較和最佳左前綴法則相似。如果左邊用了%,那后面的字符是無序的,此時(shí)就不能使用二分查找來定位元素還是退化為了全表掃描。

3.Mysql中的索引查詢?yōu)槭裁词褂昧薆+樹結(jié)構(gòu),而不使用哈希索引或者B樹?

首先哈希值是無序的,不能夠進(jìn)行范圍查找。

平衡二叉樹的缺點(diǎn)是當(dāng)數(shù)據(jù)量非常大的時(shí)候,其深度也會(huì)非常深這樣也會(huì)導(dǎo)致查找效率慢。其次其存在回旋查找的問題。比如說當(dāng)存在范圍查詢5的時(shí)候定位到該元素之后還得回溯到前面的節(jié)點(diǎn)元素6,7

B樹的最大特點(diǎn)是一個(gè)節(jié)點(diǎn)可以存儲(chǔ)多個(gè)值,這樣可以使得樹的高度變矮,從而使得樹的查找速度變快。但是其也存在回旋查找的問題。

B+樹則解決了這個(gè)問題,它的非葉子節(jié)點(diǎn)存儲(chǔ)的是key,其葉子節(jié)點(diǎn)既存儲(chǔ)了key也存儲(chǔ)了value并且其葉子節(jié)點(diǎn)是有序的,節(jié)點(diǎn)之間用指針相連也正是因?yàn)檫@一點(diǎn)使得B+樹在范圍查詢的時(shí)候不存在回旋問題。

mysql 避免索引失效

where條件==order by 條件==group by 條件 按順序遵守 最佳左前綴法則

假設(shè)創(chuàng)建了復(fù)合索引:a,b,c

不在索引列上做任何的操作(計(jì)算、函數(shù)、顯式或隱式的類型轉(zhuǎn)換),否則會(huì)導(dǎo)致索引失效而轉(zhuǎn)向全表掃描

1、字符不加單引號(hào)會(huì)導(dǎo)致索引失效

name字段為varchar類型

這條sql發(fā)生了隱式的類型轉(zhuǎn)換:數(shù)值==字符串。所以導(dǎo)致了全表掃描,索引失效

應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:

mysql中的范圍條件有:in/not in、 like、 、BETWEEN AND ;

后面的索引失效

in會(huì)導(dǎo)致索引全部失效?。?!

BETWEEN AND 范圍條件不會(huì)導(dǎo)致索引失效?。。?/p>

盡量讓索引列和查詢列一致;減少select * 的使用

1、查詢表結(jié)構(gòu)

2、查詢表的索引結(jié)構(gòu)

聯(lián)合索引:name,age,post;說明add_time字段沒有添加索引

3、查看select * 的執(zhí)行計(jì)劃

4、查看 select name,age,pos的執(zhí)行計(jì)劃

5、如果select只用一部分索引

like以通配符開頭(’%abc…’)mysql索引失效會(huì)變成全表掃描的操作。

解決:可以使用 覆蓋索引 來解決這個(gè)問題!

1、先查看表上的索引

id、name、age、pos 四個(gè)字段上都有索引; 注意:name是聯(lián)合索引中的第一個(gè),帶頭大哥!

2、查看表結(jié)構(gòu)

有個(gè)add_time字段沒有用到索引

3、查看執(zhí)行計(jì)劃

使用UNION ALL

假設(shè)創(chuàng)建了聯(lián)合索引 x(a,b,c)

ps:like雖然也是范圍查詢但是區(qū)別于、,%用在最前面就只用到索引a了;%用在最后面可以用到a+b+c!

下面的sql幾乎違背了上面的所有原則,索引依然全部生效。因?yàn)閟elect是索引覆蓋的,select里不包含沒有建立索引的字段。因此總是用到索引的。可以看出來索引覆蓋在sql優(yōu)化中的作用性

mysql 索引失效總結(jié)

首先我們還是先把表結(jié)構(gòu)說下:用戶表tb_user結(jié)構(gòu)如下:

1、 不要在索引列上進(jìn)行運(yùn)算操作, 索引將失效。

手機(jī)號(hào)phone字段有唯一索引,當(dāng)根據(jù)phone字段進(jìn)行函數(shù)運(yùn)算操作之后,索引失效:

2、 字符串類型字段使用時(shí),不加引號(hào),索引將失效。

如果字符串不加單引號(hào),對(duì)于查詢結(jié)果,沒什么影響,但是數(shù) 據(jù)庫存在隱式類型轉(zhuǎn)換,索引將失效。

3、 如果僅僅是尾部模糊匹配,索引不會(huì)失效。如果是頭部模糊匹配,索引失效。

接下來,我們來看一下這三條SQL語句的執(zhí)行效果,查看一下其執(zhí)行計(jì)劃:

由于下面查詢語句中,都是根據(jù)profession(專業(yè))字段查詢,profession字段是一個(gè)普通的索引, 我們主要看一下,模糊查詢時(shí),%加在關(guān)鍵字之前,和加在關(guān)鍵字之后的影響。

經(jīng)過上述的測試,我們發(fā)現(xiàn),在like模糊查詢中,在關(guān)鍵字后面加%,索引可以生效。而如果在關(guān)鍵字 前面加了%,索引將會(huì)失效。

4、 用or分割開的條件, 如果or前的條件中的列有索引,而后面的列中沒有索引,那么涉及的索引都不會(huì) 被用到。

由于age沒有索引,所以即使id有索引,索引也會(huì)失效。所以需要針對(duì)于age也要建立索引。

5、 數(shù)據(jù)分布影響:如果MySQL評(píng)估使用索引比全表更慢,則不使用索引。

文章標(biāo)題:mysql怎么查索引失效 mysql如何查詢索引
文章地址:http://muchs.cn/article0/dogiiio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)頁設(shè)計(jì)公司、品牌網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站制作、響應(yīng)式網(wǎng)站、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)