建立索引,要使用離散度(選擇度)更高的字段。
目前成都創(chuàng)新互聯(lián)已為上千的企業(yè)提供了網站建設、域名、網頁空間、網站托管維護、企業(yè)網站設計、巴中網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
我們先來看一個重要的屬性列的 離散度,
count(distinct(column_name)) : count(*) -- 列的全部不同值個數:所有數據行行數
數據行數相同的情況下,分子越大,列的離散度就越高。簡單來說,如果列的重復值越多,離散度就越低,重復值越少,離散度就越高。
當字段值比較長的時候,建立索引會消耗很多的空間,搜索起來也會很慢。我們可以通過截取字段的前面一部分內容建立索引,這個就叫前綴索引。
創(chuàng)建一張商戶表,因為地址字段比較長,在地址字段上建立前綴索引
create table shop(address varchar(120) not null);
alter table shop add key(address(12));? // 截取12個字符作為前綴索引是最優(yōu)的嗎?
問題是,截取多少呢?截取得多了,達不到節(jié)省索引存儲空間的目的,截取得少了,重復內容太多,字段的散列度(選擇性)會降低。怎么計算不同的長度的選擇性呢?
先看一下字段在全部數據中的選擇度計算公式:
select count(distinct address) / count(*) from shop;
select count(distinct left(address, n)) / count(*) as subn from shop;
count(distinct left(address,n)) / count(*) 的結果是會隨著 n 的變大而變大。舉個例子,現(xiàn)在有兩個address(東大街長興小區(qū),東大街福樂小區(qū)),那么 distinct(address,2) distinct(address,3)
==所以,截取的長度越長就會越接近字段在全部數據中的選擇度
==所以,我們要權衡索引大小和查詢速度。
舉個例子,通過不同長度去計算,與全表的選擇性對比:
SELECT? COUNT(DISTINCT(address))/COUNT(*) sub,? ? ? ? ? ? -- 字段在全部數據中的選擇度
COUNT(DISTINCT(LEFT(address,5)))/COUNT(*) sub5,? -- 截取前5個字符的選擇度
COUNT(DISTINCT(LEFT(address,7)))/COUNT(*) sub7,?
COUNT(DISTINCT(LEFT(address,9)))/COUNT(*) sub9,
COUNT(DISTINCT(LEFT(address,10)))/COUNT(*) sub10,? -- 截取前10個字符的選擇度
COUNT(DISTINCT(LEFT(address,11)))/COUNT(*) sub11,
COUNT(DISTINCT(LEFT(address,12)))/COUNT(*) sub12,
COUNT(DISTINCT(LEFT(address,13)))/COUNT(*) sub13,
COUNT(DISTINCT(LEFT(address,15)))/COUNT(*) sub15
FROM shop;
+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| sub? ? | sub5? | sub7? | sub9? | sub10? | sub11? | sub12? | sub13? | sub15? |
+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| 0.9993 | 0.0225 | 0.4663 | 0.8618 | 0.9734 | 0.9914 | 0.9943 | 0.9943 | 0.9958 |
+--------+--------+--------+--------+--------+--------+--------+--------+--------+
可以看到在截取 11 個字段時 sub11(0.9993) 就已經很接近字段在全部數據中的選擇度 sub(0.9958)了,而且長度也相較后面更短一些, 綜合考慮比較合適。
ALTER TABLE shop ADD KEY (address(11));
1.索引的個數不要過多(浪費空間,更新變慢)
2.在用于 where 判斷 order 排序和 join 的(on)字段上創(chuàng)建索引
3.區(qū)分度低的字段,例如性別,不要建索引(離散度太低,導致掃描行數過多)
4.更新頻繁的值,不要作為主鍵或者索引(頁分裂)
5.不建議用無序的值作為索引,例如身份證、UUID(在索引比較時需要轉為ASCII,并且插入時可能造成頁分裂)
6.若在多個字段都要創(chuàng)建索引的情況下,聯(lián)合索引優(yōu)于單值索引
7.聯(lián)合索引把散列性高(區(qū)分度高)的值放在前面
在實際開發(fā)中使用數據庫時,難免會遇到一些大表數據,對這些數據進行查詢時,有時候SQL會查詢得特別慢,這時候,有經驗的老師傅會告訴你,你看一下哪幾個字段查的多,加一個索引就好了。
那么,怎么合理地建立索引呢?這里分享一下我的一些經驗,如有不妥之處,歡迎批評指正。
1、不要盲目建立索引 , 先分析再創(chuàng)建
索引雖然能大幅度提升我們的查詢性能,但也要知道,在你進行增刪改時,索引樹也要同樣地進行維護。所以,索引不是越多越好,而是按需建立。最好是在一整塊模塊開發(fā)完成后,分析一下,去針對大多數的查詢,建立聯(lián)合索引。
2、使用聯(lián)合索引盡量覆蓋多的條件
這是說在一個慢sql里假如有五個where ,一個 order by ,那么我們的聯(lián)合索引盡量覆蓋到這五個查詢條件,如果有必要,order by 也覆蓋上 。
3、小基數字段不需要索引
這個意思是,如果一張表里某個字段的值只有那么幾個,那么你針對這個字段建立的索引其實沒什么意義,比如說,一個性別字段就兩種結果,你建了索引,排序也沒什么意思(也就是索引里把男女給分開了)
所以說,索引盡量選擇基數大的數據去建立,能最大化地利用索引
4、長字符串可以使用前綴索引
我們建立索引的字段盡量選擇字段類型較小的,比如一個varchar(20)和varchar(256)的,我們在20的上面建立的索引和在256上就有明顯的差距(字符串那么長排序也不好排呀,唉)。
當然,如果一定是要對varchar(256)建立索引,我們可以選擇里面的前20個字符放在索引樹里(這里的20不絕對,選擇能盡量分辨數據的最小字符字段設計),類似這樣KEY index(name(20),age,job) ,索引只會對name的前20個字符進行搜索,但前綴索引無法適用于order by 和 group by。
5、對排序字段設計索引的優(yōu)先級低
如果一個SQL里我們出現(xiàn)了范圍查找,后邊又跟著一個排序字段,那么我們優(yōu)先給范圍查找的字段設置索引,而不是優(yōu)先排序。
6、如果出現(xiàn)慢SQL,可以設計一個只針對該條SQL的聯(lián)合索引。
不過慢SQL的優(yōu)化,需要一步步去進行分析,可以先用explain查看SQL語句的分析結果,再針對結果去做相應的改進。explain的東西我們下次再講。
PS:在 select 語句之前增加 explain 關鍵字,MySQL 會在查詢上設置一個標記,執(zhí)行查詢會返回執(zhí)行計劃的信息,而不是 執(zhí)行這條SQL。
在mysql中,索引是一種特殊的數據庫結構,由數據表中的一列或多列組合而成,可以用來快速查詢數據表中有某一特定值的記錄。
通過索引,查詢數據時不用讀完記錄的所有信息,而只是查詢索引列即可。
通過索引,查詢數據時不用讀完記錄的所有信息,而只是查詢索引列。否則,數據庫系統(tǒng)將讀取每條記錄的所有信息進行匹配。
可以把索引比作新華字典的音序表。例如,要查“庫”字,如果不使用音序,就需要從字典的 400 頁中逐頁來找。但是,如果提取拼音出來,構成音序表,就只需要從 10 多頁的音序表中直接查找。這樣就可以大大節(jié)省時間。
因此,使用索引可以很大程度上提高數據庫的查詢速度,還有效的提高了數據庫系統(tǒng)的性能。
索引的優(yōu)缺點
索引有其明顯的優(yōu)勢,也有其不可避免的缺點。
優(yōu)點
索引的優(yōu)點如下:
1、通過創(chuàng)建唯一索引可以保證數據庫表中每一行數據的唯一性。
2、可以給所有的 MySQL 列類型設置索引。
3、可以大大加快數據的查詢速度,這是使用索引最主要的原因。
4、在實現(xiàn)數據的參考完整性方面可以加速表與表之間的連接。
5、在使用分組和排序子句進行數據查詢時也可以顯著減少查詢中分組和排序的時間
缺點
增加索引也有許多不利的方面,主要如下:
1、創(chuàng)建和維護索引組要耗費時間,并且隨著數據量的增加所耗費的時間也會增加。
2、索引需要占磁盤空間,除了數據表占數據空間以外,每一個索引還要占一定的物理空間。如果有大量的索引,索引文件可能比數據文件更快達到最大文件尺寸。
3、當對表中的數據進行增加、刪除和修改的時候,索引也要動態(tài)維護,這樣就降低了數據的維護速度。
使用索引時,需要綜合考慮索引的優(yōu)點和缺點。
標題名稱:mysql怎么選擇索引 mysql如何選擇索引
鏈接地址:http://www.chinadenli.net/article42/hpgiec.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供響應式網站、面包屑導航、動態(tài)網站、企業(yè)建站、小程序開發(fā)、App開發(fā)
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)