《Mysql應(yīng)用mysql索引優(yōu)化實(shí)例(單列索引與組合索引)》要點(diǎn):
本文介紹了Mysql應(yīng)用mysql索引優(yōu)化實(shí)例(單列索引與組合索引),希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
索引一般用于在數(shù)據(jù)規(guī)模大時(shí)對(duì)查詢進(jìn)行優(yōu)化的一種機(jī)制,對(duì)于一般的查詢來說,mysql會(huì)去遍歷整個(gè)表,來查詢符合要求的結(jié)果;MYSQL學(xué)習(xí)
如果借助于mysql索引,mysql會(huì)將要索引的字段依照一定的算法進(jìn)行處理,并生成一個(gè)類似于書本目錄的文件存放在相應(yīng)的位置,這樣在查詢時(shí),mysql會(huì)先去查找這些"目錄",然后根據(jù)這些"目錄"來快速定位所需記錄的位置,這樣的查找不用遍歷整個(gè)記錄集,速度自然會(huì)很快,對(duì)于海量數(shù)據(jù)尤其如此.MYSQL學(xué)習(xí)
注意,在向存在索引的表中插入數(shù)據(jù)時(shí),因?yàn)橐S護(hù)索引信息,要比不存在索引的表慢一些,因此當(dāng)數(shù)據(jù)量大時(shí),可以考慮在插入完數(shù)據(jù)之后再建立索引.
索引分為單列索引和組合索引,對(duì)于這兩種索引,分別介紹其索引優(yōu)化問題.MYSQL學(xué)習(xí)
1、單列索引
單列所有只包含一個(gè)字段,一個(gè)表可以包含多個(gè)單列索引,但是不要把這個(gè)和組合索引混淆.利用以下sql創(chuàng)建測(cè)試表:
?MYSQL學(xué)習(xí)
--創(chuàng)建包含單列索引的index_test_single_a表
create table `index_test_a` (
? `id` int(11) not null auto_increment,
? `title` char(255) character set utf8 not null,
? `content` text character set utf8,
? `num` int(11) default null,
? primary key (`id`),
? unique key `indexname` (`title`),
? unique key `numindex` (`num`)
) engine=innodb auto_increment=10000 default charset=latin1;MYSQL學(xué)習(xí)
--創(chuàng)建不包含單列索引的index_test_single_b表
create table `index_test_b` (
? `id` int(11) not null auto_increment,
? `title` char(255) character set utf8 not null,
? `content` text character set utf8,
? `num` int(11) default null,
? primary key (`id`)
) engine=innodb auto_increment=10000 default charset=latin1;
?MYSQL學(xué)習(xí)
其中a表包含title的單列索引,b表的title字段不存在索引,但是兩個(gè)表都有一個(gè)主鍵id,其實(shí)主鍵也是索引的一種,這個(gè)會(huì)在后面詳細(xì)解釋.?
寫程序向這兩個(gè)表中各導(dǎo)入10000條數(shù)據(jù),然后就可以測(cè)試了.MYSQL學(xué)習(xí)
1.1、測(cè)試查詢索引字段所用的時(shí)間,代碼如下:
?MYSQL學(xué)習(xí)
執(zhí)行結(jié)果如下:
a表查詢所有記錄所用時(shí)間:0.624毫秒MYSQL學(xué)習(xí)
b表查詢所有記錄所用時(shí)間:44.484毫秒MYSQL學(xué)習(xí)
可以看到僅僅10000條記錄的查找差別,時(shí)間已經(jīng)相差了幾十倍,因此對(duì)于經(jīng)常查詢的字段,索引是十分必要的.相應(yīng)的,如果我們查詢沒有做索引的字段,那么是沒有區(qū)別的,將以上的sql語句改為:
?MYSQL學(xué)習(xí)
結(jié)果如下:
a表查詢所有記錄所用時(shí)間:23.848毫秒
b表查詢所有記錄所用時(shí)間:24.155毫秒MYSQL學(xué)習(xí)
1.2、測(cè)試like查詢MYSQL學(xué)習(xí)
在我們項(xiàng)目中,如果數(shù)據(jù)量大,則不推薦like查詢,因?yàn)槠洳樵冃时容^低,但是對(duì)于索引字段來說,like能命中嗎?MYSQL學(xué)習(xí)
可以將sql語句改成如下所示:
?MYSQL學(xué)習(xí)
測(cè)試結(jié)果:
a表查詢所有記錄所用時(shí)間:0.488毫秒
b表查詢所有記錄所用時(shí)間:25.281毫秒MYSQL學(xué)習(xí)
可以看到對(duì)于模糊查詢來說,如果是前綴匹配,則會(huì)命中索引,但是如果我們將sql改為后綴匹配或者任意匹配,那么二者所消耗的查詢時(shí)間是一致的:
?MYSQL學(xué)習(xí)
a表查詢所有記錄所用時(shí)間:44.742毫秒
b表查詢所有記錄所用時(shí)間:45.752毫秒MYSQL學(xué)習(xí)
即二者都沒有命中索引.MYSQL學(xué)習(xí)
1.3、測(cè)試or語句,將sql改為如下所示:
?MYSQL學(xué)習(xí)
測(cè)試結(jié)果如下:
a表查詢所有記錄所用時(shí)間:49.904毫秒MYSQL學(xué)習(xí)
b表查詢所有記錄所用時(shí)間:50.131毫秒MYSQL學(xué)習(xí)
繼續(xù)將sql改為如下:
?MYSQL學(xué)習(xí)
測(cè)試結(jié)果如下:
a表查詢所有記錄所用時(shí)間:0.86毫秒MYSQL學(xué)習(xí)
b表查詢所有記錄所用時(shí)間:47.318毫秒MYSQL學(xué)習(xí)
從上面的結(jié)果可以看到,當(dāng)or中有一個(gè)字段沒有索引的時(shí)候,那么將不會(huì)命中索引;反之,如果or運(yùn)算的所有字段均做了索引,那么是可以命中的.MYSQL學(xué)習(xí)
1.4、測(cè)試in,將sql語句繼續(xù)改為如下所示:
?MYSQL學(xué)習(xí)
測(cè)試結(jié)果為:
a表查詢所有記錄所用時(shí)間:0.817毫秒
b表查詢所有記錄所用時(shí)間:24.234毫秒MYSQL學(xué)習(xí)
?可見對(duì)于索引字段,in也是可以命中索引的.MYSQL學(xué)習(xí)
1.5、測(cè)試<,>,between等,將sql改為如下所示:
?MYSQL學(xué)習(xí)
測(cè)試結(jié)果如下:
a表查詢所有記錄所用時(shí)間:11.469毫秒
b表查詢所有記錄所用時(shí)間:21.728毫秒MYSQL學(xué)習(xí)
可見二者差別不是很大,因此是沒有命中索引的.MYSQL學(xué)習(xí)
1.6、對(duì)于mysql函數(shù),索引的命中,將sql改為如下所示:
?MYSQL學(xué)習(xí)
得到的結(jié)果如下所示:
a表查詢所有記錄所用時(shí)間:11.322毫秒
b表查詢所有記錄所用時(shí)間:12.429毫秒MYSQL學(xué)習(xí)
所以如果在條件中使用函數(shù),那么索引將會(huì)失效.MYSQL學(xué)習(xí)
2、組合索引MYSQL學(xué)習(xí)
組合索引包括對(duì)多個(gè)列的索引,而不是多個(gè)單列索引的組合,將表a中的所以改成(title,num)的組合索引,進(jìn)行以下測(cè)試:MYSQL學(xué)習(xí)
2.1、or測(cè)試MYSQL學(xué)習(xí)
將sql語句改成如下所示:
?MYSQL學(xué)習(xí)
?結(jié)果如下所示:
a表查詢所有記錄所用時(shí)間:52.535毫秒
b表查詢所有記錄所用時(shí)間:53.031毫秒MYSQL學(xué)習(xí)
這時(shí)索引沒有命中,索引組合索引的or運(yùn)算和兩個(gè)單列索引的or運(yùn)算是不同的,前者失效而后者依然有效.MYSQL學(xué)習(xí)
2.2、and測(cè)試MYSQL學(xué)習(xí)
將sql語句改成如下所示:
?MYSQL學(xué)習(xí)
?結(jié)果如下所示:
a表查詢所有記錄所用時(shí)間:0.666毫秒
b表查詢所有記錄所用時(shí)間:43.042毫秒MYSQL學(xué)習(xí)
繼續(xù)改為:
?MYSQL學(xué)習(xí)
?得到的結(jié)果:
a表查詢所有記錄所用時(shí)間:39.398毫秒
b表查詢所有記錄所用時(shí)間:41.057毫秒MYSQL學(xué)習(xí)
?而改成如下sql:
?MYSQL學(xué)習(xí)
?得到的結(jié)果則為:
a表查詢所有記錄所用時(shí)間:0.753毫秒
b表查詢所有記錄所用時(shí)間:48.248毫秒MYSQL學(xué)習(xí)
由以上三組結(jié)果可以看出,組合索引是最左前綴匹配的,即條件中要包含第一個(gè)索引列,才會(huì)命中索引.MYSQL學(xué)習(xí)
3、索引的優(yōu)缺點(diǎn)MYSQL學(xué)習(xí)
利用索引可以大大加快我們的搜索,但是維護(hù)索引需要額外的開銷,尤其是當(dāng)索引較多的時(shí)候,大量的數(shù)據(jù)會(huì)很容易帶來索引量的膨脹,因此對(duì)于頻繁要用到的查詢,才需要做索引,這樣才能以最小的代價(jià)獲得最大的性能提升.
mysql索引優(yōu)化應(yīng)用實(shí)例
MySql索引優(yōu)化注意要點(diǎn)
mysql索引與mysql索引優(yōu)化查詢
Mysql索引優(yōu)化辦法解析
深入理解MySQL索引與優(yōu)化
mysql索引優(yōu)化實(shí)例分享
mysql索引使用與優(yōu)化
分享:Mysql索引優(yōu)化的技巧
mysql性能優(yōu)化之索引優(yōu)化MYSQL學(xué)習(xí)
《Mysql應(yīng)用mysql索引優(yōu)化實(shí)例(單列索引與組合索引)》是否對(duì)您有啟發(fā),歡迎查看更多與《Mysql應(yīng)用mysql索引優(yōu)化實(shí)例(單列索引與組合索引)》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/8905.html