更新時(shí)間:2021-01-15 17:27:42 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1713次
我們?cè)谑褂肕ySQL數(shù)據(jù)庫(kù)時(shí),可以根據(jù)數(shù)據(jù)庫(kù)的功能,在數(shù)據(jù)庫(kù)設(shè)計(jì)器中創(chuàng)建不同的索引,但我們選擇索引的最終目的還是為了使查詢的速度變快,提高查詢數(shù)據(jù)的效率。因此,MySQL索引設(shè)計(jì)是有一套規(guī)則可行的,為了我們能夠更好地設(shè)計(jì)出高效的索引,下面我們就來為大家講一講常用的12個(gè)MySQL索引設(shè)計(jì)原則。
1.索引最左匹配原則
索引可以簡(jiǎn)單如一個(gè)列(a),也可以復(fù)雜如多個(gè)列(a, b, c, d),即聯(lián)合索引。
如果是聯(lián)合索引,那么key也由多個(gè)列組成,同時(shí),索引只能用于查找key是否存在(相等),遇到范圍查詢(>、<、between、like左匹配)等就不能進(jìn)一步匹配了,后續(xù)退化為線性查找。因此,列的排列順序決定了可命中索引的列數(shù)。理解最左匹配原則,對(duì)我們?cè)O(shè)計(jì)索引和編寫高效SQL語(yǔ)句非常有幫助
例子:
如有索引(a, b, c, d),查詢條件a = 1 and b = 2 and c > 3 and d = 4,則會(huì)在每個(gè)節(jié)點(diǎn)依次命中a、b、c,無法命中d。(很簡(jiǎn)單:索引命中只能是相等的情況,不能是范圍匹配)
2.為經(jīng)常需要排序、分組操作的字段建立索引
經(jīng)常需要ORDER BY、GROUP BY、DISTINCT等操作的字段,排序操作會(huì)浪費(fèi)很多時(shí)間。如果為其建立索引,可以有效地避免排序操作。
3.為常作為查詢條件的字段建立索引
如果某個(gè)字段經(jīng)常用來做查詢條件,那么該字段的查詢速度會(huì)影響整個(gè)表的查詢速度。因此,為這樣的字段建立索引,可以提高整個(gè)表的查詢速度。
4.限制索引的數(shù)目
索引的數(shù)目不是越多越好。每個(gè)索引都需要占用磁盤空間,索引越多,需要的磁盤空間就越大。修改表時(shí),對(duì)索引的重構(gòu)和更新很麻煩。越多的索引,會(huì)使更新表變得很浪費(fèi)時(shí)間。
5.盡量選擇區(qū)分度高的列作為索引
盡量選擇區(qū)分度高的列作為索引,區(qū)分度的公式是count(distinct col)/count(*),表示字段不重復(fù)的比例,比例越大我們掃描的記錄數(shù)越少,唯一鍵的區(qū)分度是1,而一些狀態(tài)、性別字段可能在大數(shù)據(jù)面前區(qū)分度就是0,那可能有人會(huì)問,這個(gè)比例有什么經(jīng)驗(yàn)值嗎?使用場(chǎng)景不同,這個(gè)值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃描10條記錄
6.索引列不能參與計(jì)算
索引列不能參與計(jì)算,保持列“干凈”,比如fromunixtime(createtime) = ’2019-12-02’就不能使用到索引,原因很簡(jiǎn)單,b+樹中存的都是數(shù)據(jù)表中的字段值,但進(jìn)行檢索時(shí),需要把所有元素都應(yīng)用函數(shù)才能比較,顯然成本太大。所以語(yǔ)句應(yīng)該寫成createtime = unixtimestamp(’2014-05-29’);即索引列不能帶函數(shù),否則會(huì)導(dǎo)致索引失效
7.擴(kuò)展索引
盡量的擴(kuò)展索引,不要新建索引。比如表中已經(jīng)有a的索引,現(xiàn)在要加(a,b)的索引,那么只需要修改原來的索引即可
8.盡量使用數(shù)據(jù)量少的索引
如果索引的值很長(zhǎng),那么查詢的速度會(huì)受到影響。例如,對(duì)一個(gè)CHAR(100)類型的字段進(jìn)行全文檢索需要的時(shí)間要比對(duì)CHAR(10)類型的字段需要的時(shí)間要多。
9.盡量使用前綴來索引
如果索引字段的值很長(zhǎng),最好使用值的前綴來索引。例如,TEXT和BLOG類型的字段,進(jìn)行全文檢索會(huì)很浪費(fèi)時(shí)間。如果只檢索字段的前面的若干個(gè)字符,這樣可以提高檢索速度。
10.刪除不再使用或者很少使用的索引
表中的數(shù)據(jù)被大量更新,或者數(shù)據(jù)的使用方式被改變后,原有的一些索引可能不再需要。數(shù)據(jù)庫(kù)管理員應(yīng)當(dāng)定期找出這些索引,將它們刪除,從而減少索引對(duì)更新操作的影響。
11.=和in可以亂序。
比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優(yōu)化器會(huì)幫你優(yōu)化成索引可以識(shí)別的形式
12.聯(lián)合查詢
聯(lián)合查詢,子查詢等多表操作時(shí)關(guān)連字段要加索引
,根據(jù)以上的介紹,對(duì)于常用的12條mysql索引設(shè)計(jì)原則,相必大家都有了一定的掌握和了解,事實(shí)上上述提到的12條原則是最基本的MySQL索引設(shè)計(jì)原則,但不能拘泥于這些準(zhǔn)則,應(yīng)該根據(jù)應(yīng)用的實(shí)際情況進(jìn)行分析和判斷,選擇最合適的索引方式。當(dāng)然,如果我們能夠通過在本站的MySQL教程的學(xué)習(xí),熟練掌握MySQL數(shù)據(jù)庫(kù)中的各種機(jī)制和原理,對(duì)于我們?cè)O(shè)計(jì)MySQL索引,更是如虎添翼了。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743