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

歡迎訪問 生活随笔!

生活随笔

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

数据库

nacative mysql_MySQL索引优化

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

MySQL官方對索引的定義:索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。索引是在存儲引擎中實(shí)現(xiàn)的,所以每種存儲引擎中的索引都不一樣。如MYISAM和InnoDB存儲引擎只支持BTree索引;MEMORY和HEAP儲存引擎可以支持HASH和BTREE索引。

這里僅針對常用的InnoDB存儲引擎所支持的BTree索引進(jìn)行介紹:

一、索引類型

先創(chuàng)建一個新表,用于演示索引類型

CREATE TABLEindex_table (

idBIGINT NOT NULL auto_increment COMMENT '主鍵',

NAMEVARCHAR (10) COMMENT '姓名',

ageINT COMMENT '年齡',

phoneNumCHAR (11) COMMENT '手機(jī)號',PRIMARY KEY(id)

) ENGINE= INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;

下圖是Col2為索引列,記錄與B樹結(jié)構(gòu)的對應(yīng)圖,僅供參考:

1、普通索引

這是最基本的索引,沒有任何限制。

------直接創(chuàng)建索引

create index index_name on index_table(name);

2、唯一索引

索引列的值必須唯一,可以有空值

---------直接創(chuàng)建唯一索引

create UNIQUE index index_phoneNum on index_table(phoneNum);

3、主鍵

是一種特殊的唯一索引,必須指定為 PRIMARY KEY,如我們常用的AUTO_INCREMENT自增主鍵

4、多列索引

也稱為組合索引,就是在多個字段上聯(lián)合建立一個索引

-------直接創(chuàng)建組合索引

create index index_union on index_table(name,age,phoneNum);

這里一個組合索引,相當(dāng)于在有如下三個索引:

name;

name,age;

name,age,phoneNum;

這里或許有這樣一個疑惑:為什么age或者age,phoneNum字段上沒有索引。這是由于BTree索引因要遵守最左前綴原則,這個原則在后面詳細(xì)展開。

二、索引優(yōu)化

1、選擇索引列

創(chuàng)建索引簡單,但是在哪些列上創(chuàng)建索引則需要好好思考。可以考慮在where字句中出現(xiàn)列或者join字句中出現(xiàn)的列上建索引

SELECTage----不使用索引

FROMindex_unionWHERENAME= 'xiaoming'---考慮使用索引

AND phoneNum = '18668247687';---考慮使用索引

2、最左前綴原則

聯(lián)合索引(name,age,phoneNum) ,B+樹是按照從左到右的順序來建立搜索樹的。如('張三',18,'18668247652')來檢索數(shù)據(jù)的時候,B+樹會優(yōu)先匹配name來確定搜索方向,name匹配成功再依次匹配age、phoneNum,最后檢索到最終的數(shù)據(jù)。也就是說這種情況下是有三級索引,當(dāng)name相同,查找age,age也相同時,去比較phoneNum;但是如果拿 (18,'18668247652')來檢索時,B+樹沒有拿到一級索引,根本就無法確定下一步的搜索方向。('張三','18668247652')這種場景也是一樣,當(dāng)name匹配成功后,沒有age這個二級索引,只能在name相同的情況下,去遍歷所有的phoneNum。

B+樹的數(shù)據(jù)結(jié)構(gòu)決定了在使用索引的時候必須遵守最左前綴原則,在創(chuàng)建聯(lián)合索引的時候,盡量將經(jīng)常參與查詢的字段放在聯(lián)合索引的最左邊。

3、like的使用

一般情況下不建議使用like操作,如果非使用不可的話,需要注意:like '%abd%'不會使用索引,而like ‘a(chǎn)aa%’可以使用索引。這也是前面的最左前綴原則的一個使用場景。

4、不能使用索引說明

mysql會按照聯(lián)合索引從左往右進(jìn)行匹配,直到遇到范圍查詢,如:>, 3 and d = 4,如果建立(a,b,c,d)順序的索引,d是不會使用索引的。但如果聯(lián)合索引是(a,b,d,c)的話,則a b d c都可以使用到索引,只是最終c是一個范圍值。

5、order by

order by排序有兩種排序方式:using filesort使用算法在內(nèi)存中排序以及使用mysql的索引進(jìn)行排序;我們在部分不情況下希望的是使用索引。

select test_index where id = 3 order by id desc;

如果ID是單列索引,則order by會使用索引

select test_index where id = 3 order by name desc;

如果ID是單列索引,name不是索引或者name也是單列索引,則order by不會使用索引。因?yàn)镸ysql的一次查詢只會從眾多索引中選擇一個索引,而這次查詢中使用的是ID列索引,而不是name列索引。在這種場景下,如果想讓order by也使用索引的話,就建立聯(lián)合索引(id,name),這里需要注意最左前綴原則,不要建立這樣的聯(lián)合索引(name,id)。

最后需要注意mysql對排序記錄的大小有限制:max_length_for_sort_data 默認(rèn)為1024;也就意味著如果需要排序的數(shù)據(jù)量大于1024,則order by不會使用索引,而是使用using filesort。

總結(jié)

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

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