本篇內(nèi)容主要講解“怎么理解并掌握mysql索引之前綴索引”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么理解并掌握mysql索引之前綴索引”吧!

有時(shí)候需要很長(zhǎng)的索引字符串,這樣會(huì)使得索引變的很大而且很慢.通常可以索引開(kāi)始的部分字符,這樣可以大大節(jié)省空間提升索引效率,但這樣也會(huì)降低索引的選擇性.索引的選擇性是指,不重復(fù)的索引值和數(shù)據(jù)表的記錄總數(shù)的比值,范圍從1#T到1之間.索引的選擇性越高則查詢效率越高,因?yàn)檫x擇性高的索引可以讓mysql在查找時(shí)過(guò)濾掉更多的行,唯一索引的選擇性是1,這是最好的索引選擇性,性能也是最好的.
一般情況下某個(gè)列前綴的選擇性也是足夠高的,足以滿足查詢性能.對(duì)于BLOB,TEXT或者很長(zhǎng)的varchar類型的列,必須使用前綴索引,因?yàn)閙ysql不允許索引這些列的完整長(zhǎng)度.
訣竅在于要選擇足夠長(zhǎng)的前綴以保證較高的選擇性,同時(shí)又不能太長(zhǎng).前綴長(zhǎng)的選擇性接近于索引整個(gè)列.換句話說(shuō),前綴的基數(shù)應(yīng)該接近于完整列的基數(shù).
為了決定前綴合適長(zhǎng)度,需要找到最常見(jiàn)值的列表,然后和最常見(jiàn)的前綴列表進(jìn)行比較.
如下構(gòu)建一張表:
mysql> use sakila; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> create table city_demo(city varchar(50) not null); Query OK, 0 rows affected (0.15 sec) mysql> insert into city_demo(city) select city from city; Query OK, 600 rows affected (0.11 sec) Records: 600 Duplicates: 0 Warnings: 0 mysql> insert into city_demo(city) select city from city_demo; Query OK, 600 rows affected (0.09 sec) Records: 600 Duplicates: 0 Warnings: 0 mysql> update city_demo set city=(select city from city order by rand() limit 1); Query OK, 1196 rows affected (0.85 sec) Rows matched: 1200 Changed: 1196 Warnings: 0
有了數(shù)據(jù)集,數(shù)據(jù)分布不是真實(shí)分布,僅為演示.首先找到最常見(jiàn)的城市列表:
mysql> select count(*) as cnt,city from city_demo group by city order by cnt desc limit 10; +-----+-------------------------+ | cnt | city | +-----+-------------------------+ | 7 | Oshawa | | 7 | Uijongbu | | 7 | Ktahya | | 6 | Haiphong | | 6 | Berhampore (Baharampur) | | 6 | Urawa | | 6 | Mysore | | 6 | Witten | | 6 | Sunnyvale | | 6 | Esfahan | +-----+-------------------------+ 10 rows in set (0.01 sec)
如上每個(gè)值都出現(xiàn)了6-7次,現(xiàn)在找出最頻繁出現(xiàn)城市的前綴,先從前綴字母開(kāi)始:
mysql> select count(*) as cnt,left(city,3) as pref from city_demo group by pref order by cnt desc limit 10; +-----+------+ | cnt | pref | +-----+------+ | 28 | San | | 16 | Cha | | 14 | Hal | | 12 | al- | | 11 | Bat | | 11 | Shi | | 10 | Val | | 10 | Ben | | 10 | Bra | | 9 | Tar | +-----+------+ 10 rows in set (0.00 sec)
每個(gè)前綴出現(xiàn)的都比原來(lái)城市次數(shù)多,因此唯一前綴比唯一城市要少得多,然后增加前綴長(zhǎng)度,直到這個(gè)前綴的選擇性接近完整列的選著性,計(jì)算合適前綴長(zhǎng)度的一個(gè)辦法計(jì)算完整列的選擇性,并使前綴的選擇性趨于完整列的選擇性.如下計(jì)算完整列的選擇性:
mysql> select count(distinct city)/count(*) from city_demo; +-------------------------------+ | count(distinct city)/count(*) | +-------------------------------+ | 0.4300 | +-------------------------------+ 1 row in set (0.01 sec)
計(jì)算前綴選擇性趨于或接近0.43這個(gè)值:
mysql> select count(distinct left(city,3))/count(*) from city_demo; +---------------------------------------+ | count(distinct left(city,3))/count(*) | +---------------------------------------+ | 0.3350 | +---------------------------------------+ 1 row in set (0.01 sec) mysql> select count(distinct left(city,4))/count(*) from city_demo; +---------------------------------------+ | count(distinct left(city,4))/count(*) | +---------------------------------------+ | 0.4058 | +---------------------------------------+ 1 row in set (0.00 sec) mysql> select count(distinct left(city,5))/count(*) from city_demo; +---------------------------------------+ | count(distinct left(city,5))/count(*) | +---------------------------------------+ | 0.4208 | +---------------------------------------+ 1 row in set (0.00 sec) mysql> select count(distinct left(city,6))/count(*) from city_demo; +---------------------------------------+ | count(distinct left(city,6))/count(*) | +---------------------------------------+ | 0.4267 | +---------------------------------------+
查詢顯示當(dāng)前綴長(zhǎng)度達(dá)到5的時(shí)候,再增加長(zhǎng)度,選擇性提升幅度已經(jīng)不大.
只看平均選擇性是不夠的,也有列外情況,需要考慮最壞情況下的選擇性,平均選擇性會(huì)讓你認(rèn)為前綴長(zhǎng)度為3或4的索引已經(jīng)足夠,但是如果數(shù)據(jù)分布很不均勻就會(huì)有陷阱.
上面示例如果找到合適前綴長(zhǎng)度,下面示例如何創(chuàng)建前綴索引:
mysql> alter table city_demo add key(city(5)); Query OK, 0 rows affected (0.34 sec) Records: 0 Duplicates: 0 Warnings: 0
到此,相信大家對(duì)“怎么理解并掌握mysql索引之前綴索引”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
當(dāng)前名稱:怎么理解并掌握mysql索引之前綴索引-創(chuàng)新互聯(lián)
鏈接地址:http://www.chinadenli.net/article34/djddpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈、網(wǎng)站營(yíng)銷、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)