MySQL的復(fù)合索引可以創(chuàng)建多個(gè),每個(gè)復(fù)合索引可以包含一列或多列。復(fù)合索引使用的基本原則是左側(cè)對(duì)齊原則。例如,復(fù)合索引包含A,B,C字段,實(shí)際相當(dāng)于創(chuàng)建了5個(gè)索引,即:
在通遼等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,通遼網(wǎng)站建設(shè)費(fèi)用合理。
那么問(wèn)題來(lái)了,如果我們創(chuàng)建兩個(gè)復(fù)合索引,復(fù)合索引1:包含A,B,C列和復(fù)合索引2:包含B,C列,MySQL如何執(zhí)行呢?
按照正常的邏輯,和復(fù)合索引的原則,應(yīng)該能命中的索引是A_B_C_index,讓我們拭目以待吧!
結(jié)果:和上次測(cè)試的不一致,這次雖然包含ABC三個(gè)列,但命中的索引是B_C_index
重要結(jié)論:當(dāng)命中兩個(gè)或者多個(gè)不同的復(fù)合索引時(shí),按照創(chuàng)建順序不同,MySQL會(huì)有不同策略來(lái)選取其中的一個(gè)復(fù)合索引。
CREATE
[UNIQUE]
INDEX
ON
(字段
[ASC|DESC]);
UNIQUE
--確保所有的索引列中的值都是可以區(qū)分的。
[ASC|DESC]
--在列上按指定排序創(chuàng)建索引。
(創(chuàng)建索引的準(zhǔn)則:
1.如果表里有幾百行記錄則可以對(duì)其創(chuàng)建索引(表里的記錄行數(shù)越多索引的效果就越明顯)。
2.不要試圖對(duì)表創(chuàng)建兩個(gè)或三個(gè)以上的索引。
3.為頻繁使用的行創(chuàng)建索引。
)
示例
create
index
i_1
on
emp(empno
asc);
mysql數(shù)據(jù)庫(kù)索引是一種能夠讓mysql數(shù)據(jù)查詢更加快速的數(shù)據(jù)結(jié)構(gòu),我們?cè)谛陆〝?shù)據(jù)庫(kù)的時(shí)候,如果設(shè)置了某個(gè)字段的Primary key主鍵,那么數(shù)據(jù)庫(kù)會(huì)默認(rèn)為我們的主鍵字段創(chuàng)建一個(gè)唯一索引(Unique Index)的東西,所以你就不需要再為此字段創(chuàng)建mysql數(shù)據(jù)庫(kù)索引了,當(dāng)然了,如果你想設(shè)置別的字段索引,那么就要額外加入該字段的數(shù)據(jù)庫(kù)索引了。
一:Mysql數(shù)據(jù)庫(kù)索引的創(chuàng)建
1)如何為我們的mysql數(shù)據(jù)庫(kù)添加索引呢?很簡(jiǎn)單,請(qǐng)看下面的創(chuàng)建mysql普通索引格式:
CREATE INDEX [index name] ON [table name]([column name]);
參數(shù)說(shuō)明:NameDescription
index name索引名稱.
table name需要添加索引的表名稱.
column name需要添加索引的列名稱.
例如我們要?jiǎng)?chuàng)建一個(gè)索引,就可以使用如下的mysql命令運(yùn)行即可:CREATE INDEX myindex ON mytable(aut_id);
2)唯一索引的創(chuàng)建,和mysql普通索引差不多,只需要在INDEX關(guān)鍵詞前面加入U(xiǎn)NIQUE關(guān)鍵詞即可,mysql命令如下:CREATE UNIQUE INDEX myindex ON mytable(aut_id);
我們也可以使用USING BTREE關(guān)鍵字,B-tree算法減少定位記錄時(shí)所經(jīng)歷的中間過(guò)程,從而加快存取速度,mysql命令如下:CREATE UNIQUE INDEX myindex ON mytable(aut_id) USING BTREE;
二:查看mysql數(shù)據(jù)庫(kù)索引
我們可以使用以下命令查詢剛剛新建的mysql數(shù)據(jù)庫(kù)索引,“from mytable”代表查詢?cè)摂?shù)據(jù)庫(kù)表里面有哪些索引,mysql命令如下:show index from mytable;
創(chuàng)建成功之后,會(huì)在“key_name”字段中顯示剛剛創(chuàng)建的數(shù)據(jù)庫(kù)索引名稱,如圖所示:
三:刪除mysql數(shù)據(jù)庫(kù)索引
我們也可以使用mysql命令刪除某張表的索引,命令如下:drop index english on mytable
四:查詢sql語(yǔ)句是否使用了mysql索引
我們上面常見(jiàn)好mysql數(shù)據(jù)庫(kù)索引之后,如果想要知道我們?cè)趫?zhí)行sql語(yǔ)句時(shí)是否使用了數(shù)據(jù)庫(kù)索引,就要在sql語(yǔ)句前面加入“EXPLAIN”關(guān)鍵詞,命令如下所示:EXPLAIN SELECT * FROM `allword` where english='America';
如果使用到了我們創(chuàng)建的字段索引,就會(huì)看到如圖所示的字段都不會(huì)是NULL空值,如下:
在有些情況下mysql索引會(huì)失效,也就是在執(zhí)行到sql語(yǔ)句時(shí)沒(méi)有使用到我們創(chuàng)建的數(shù)據(jù)庫(kù)表字段索引,可能有以下這些情況:
1:使用了OR關(guān)鍵字查詢
2:或者LOWER(),UPPER()函數(shù),
3:還有一種就是使用了LIKE關(guān)鍵字查詢,像(like '%XX'或者like '%XX%')這樣的語(yǔ)句,但是像(like 'XX%')這種情況的mysql表索引是不會(huì)失效的。
在mysql中,索引是一種特殊的數(shù)據(jù)庫(kù)結(jié)構(gòu),由數(shù)據(jù)表中的一列或多列組合而成,可以用來(lái)快速查詢數(shù)據(jù)表中有某一特定值的記錄。
通過(guò)索引,查詢數(shù)據(jù)時(shí)不用讀完記錄的所有信息,而只是查詢索引列即可。
通過(guò)索引,查詢數(shù)據(jù)時(shí)不用讀完記錄的所有信息,而只是查詢索引列。否則,數(shù)據(jù)庫(kù)系統(tǒng)將讀取每條記錄的所有信息進(jìn)行匹配。
可以把索引比作新華字典的音序表。例如,要查“庫(kù)”字,如果不使用音序,就需要從字典的 400 頁(yè)中逐頁(yè)來(lái)找。但是,如果提取拼音出來(lái),構(gòu)成音序表,就只需要從 10 多頁(yè)的音序表中直接查找。這樣就可以大大節(jié)省時(shí)間。
因此,使用索引可以很大程度上提高數(shù)據(jù)庫(kù)的查詢速度,還有效的提高了數(shù)據(jù)庫(kù)系統(tǒng)的性能。
索引的優(yōu)缺點(diǎn)
索引有其明顯的優(yōu)勢(shì),也有其不可避免的缺點(diǎn)。
優(yōu)點(diǎn)
索引的優(yōu)點(diǎn)如下:
1、通過(guò)創(chuàng)建唯一索引可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。
2、可以給所有的 MySQL 列類型設(shè)置索引。
3、可以大大加快數(shù)據(jù)的查詢速度,這是使用索引最主要的原因。
4、在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面可以加速表與表之間的連接。
5、在使用分組和排序子句進(jìn)行數(shù)據(jù)查詢時(shí)也可以顯著減少查詢中分組和排序的時(shí)間
缺點(diǎn)
增加索引也有許多不利的方面,主要如下:
1、創(chuàng)建和維護(hù)索引組要耗費(fèi)時(shí)間,并且隨著數(shù)據(jù)量的增加所耗費(fèi)的時(shí)間也會(huì)增加。
2、索引需要占磁盤(pán)空間,除了數(shù)據(jù)表占數(shù)據(jù)空間以外,每一個(gè)索引還要占一定的物理空間。如果有大量的索引,索引文件可能比數(shù)據(jù)文件更快達(dá)到最大文件尺寸。
3、當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。
使用索引時(shí),需要綜合考慮索引的優(yōu)點(diǎn)和缺點(diǎn)。