20分鐘數(shù)據(jù)庫索引設計實戰(zhàn)

在后端開發(fā)的工作中如何輕松绣否、高效地設計大量數(shù)據(jù)庫索引呢誊涯?通過下面這四步,20分鐘后你就再也不會為數(shù)據(jù)庫的索引設計而發(fā)愁了蒜撮。

順暢地閱讀這篇文章需要了解數(shù)據(jù)庫索引的組織方式暴构,如果你還不熟悉的話,可以通過另一篇文章來快速了解一下——數(shù)據(jù)庫索引融會貫通淀弹。

這篇文章是一系列數(shù)據(jù)庫索引文章中的第三篇丹壕,這個系列包括了下面四篇文章:

  1. 數(shù)據(jù)庫索引是什么?新華字典來幫你 —— 理解
  2. 數(shù)據(jù)庫索引融會貫通 —— 深入
  3. 20分鐘數(shù)據(jù)庫索引設計實戰(zhàn) —— 實戰(zhàn)
  4. 數(shù)據(jù)庫索引為什么用B+樹實現(xiàn)薇溃? —— 擴展

這一系列涵蓋了數(shù)據(jù)庫索引從理論到實踐的一系列知識菌赖,一站式解決了從理解到融會貫通的全過程,相信每一篇文章都可以給你帶來更深入的體驗沐序。

1. 整理查詢條件

我們設計索引的目的主要是為了加快查詢琉用,所以堕绩,設計索引的第一步是整理需要用到的查詢條件,也就是我們會在where子句邑时、join連接條件中使用的字段奴紧。一般來說會整理程序中除了insert語句之外的所有SQL語句,按不同的表分別整理出每張表上的查詢條件晶丘。也可以根據(jù)對業(yè)務的理解添加一些暫時還沒有使用到的查詢條件黍氮。

對索引的設計一般會逐表進行,所以按數(shù)據(jù)表收集查詢條件可以方便后面步驟的執(zhí)行浅浮。

2. 分析字段的可選擇性

整理出所有查詢條件之后沫浆,我們需要分析出每個字段的可選擇性,那么什么是可選擇性呢滚秩?

字段的可選擇性指的就是字段的值的區(qū)分度专执,例如一張表中保存了用戶的手機號、性別郁油、姓名本股、年齡這幾個字段,且一個手機號只能注冊一個用戶桐腌。在這種情況下拄显,像手機號這種唯一的字段就是可選擇性最高的一種情況;而年齡雖然有幾十種可能哩掺,但是區(qū)分度就沒有手機號那么大了凿叠;性別這樣的字段則只有幾種可能涩笤,所以可選擇性最差嚼吞。所以俺可選擇性從高到低排列就是:手機號 > 年齡 > 性別。

但是不同字段的值分布是不同的蹬碧,有一些值的數(shù)量是大致均勻的舱禽,例如性別為男和女的值數(shù)量可能就差別不大,但是像年齡超過100歲這樣的記錄就非常少了恩沽。所以對于年齡這個字段誊稚,20-30這樣的值就是可選擇性很小的,因為每一個年齡都有非常多的記錄罗心;但是像100這樣的值里伯,那它的可選擇性就非常高了。

如果我們在表中添加了一個字段表示用戶是否是管理員渤闷,那么在查詢網(wǎng)站的管理員信息列表時疾瓮,這個字段的可選擇性就非常高。但是如果我們要查詢的是非管理員信息列表時飒箭,這個字段的可選擇性就非常低了狼电。

從經(jīng)驗上來說蜒灰,我們會把可選擇性高的字段放到前面,可選擇性低的字段放在后面肩碟,如果可選擇性非常低强窖,一般不會把這樣的字段放到索引里。

3. 合并查詢條件

雖然索引可以加快查詢的效率削祈,但是索引越多就會導致插入和更新數(shù)據(jù)的成本變高翅溺,因為索引是分開存儲的,所有數(shù)據(jù)的插入和更新操作都要對相關的索引進行修改髓抑。所以設計索引時還需要控制索引的數(shù)量未巫,不能盲目地增加索引。

一般我們會根據(jù)最左匹配原則來合并查詢條件启昧,盡可能讓不同的查詢條件使用同一個索引叙凡。例如有兩個查詢條件where a = 1 and b = 1where b = 1,那么我們就可以創(chuàng)建一個索引idx_eg(b, a)來同時服務兩個查詢條件密末。

同時握爷,因為范圍條件會終止使用索引中后續(xù)的字段,所以對于使用范圍條件查詢的字段我們也會盡可能放在索引的后面严里。

4. 考慮是否需要使用全覆蓋索引

最后新啼,我們會考慮是否需要使用全覆蓋索引,因為全覆蓋索引沒有回表的開銷刹碾,效率會更高燥撞。所以一般我們會在回表成本特別高的情況下考慮是否使用全覆蓋索引,例如根據(jù)索引字段篩選后的結果需要返回其他字段或者使用其他字段做進一步篩選的情況迷帜。

例如物舒,我們有一張用戶表,其中有年齡戏锹、姓名冠胯、手機號三個字段。我們需要查詢在指定年齡的所有用戶的姓名锦针,已有索引idx_age_name(年齡, 姓名)荠察,目前我們使用下面這樣的查詢語句進行查詢:

SELECT *
FROM 用戶表
WHERE 年齡 = ?;

一般情況下,將一個索引優(yōu)化為全覆蓋索引有兩種方式:

  1. 增加索引中的字段奈搜,讓索引字段覆蓋SQL語句中使用的所有字段
    • 在這個例子中悉盆,我們可以創(chuàng)建一個同時包含所有字段的索引idx_all(年齡, 姓名, 手機號),以此提高查詢的效率馋吗。
  2. 減少SQL語句中使用的字段焕盟,使SQL需要的字段都包含在現(xiàn)有索引中
    • 在這個例子中,其實更好的方法是將SELECT子句修改為SELECT 姓名耗美,因為我們的需求只是查詢用戶的姓名京髓,并不需要手機號字段航缀,去掉SELECT子句多余的字段不僅能夠滿足我們的需求,而且也不用對索引做修改堰怨。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芥玉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子备图,更是在濱河造成了極大的恐慌灿巧,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揽涮,死亡現(xiàn)場離奇詭異抠藕,居然都是意外死亡,警方通過查閱死者的電腦和手機蒋困,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門盾似,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雪标,你說我怎么就攤上這事零院。” “怎么了村刨?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵告抄,是天一觀的道長。 經(jīng)常有香客問我嵌牺,道長打洼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任逆粹,我火速辦了婚禮募疮,結果婚禮上,老公的妹妹穿的比我還像新娘枯饿。我一直安慰自己酝锅,他們只是感情好诡必,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布奢方。 她就那樣靜靜地躺著,像睡著了一般爸舒。 火紅的嫁衣襯著肌膚如雪蟋字。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天扭勉,我揣著相機與錄音鹊奖,去河邊找鬼。 笑死涂炎,一個胖子當著我的面吹牛忠聚,可吹牛的內(nèi)容都是我干的设哗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼两蟀,長吁一口氣:“原來是場噩夢啊……” “哼网梢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赂毯,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤战虏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后党涕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烦感,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年膛堤,在試婚紗的時候發(fā)現(xiàn)自己被綠了手趣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡肥荔,死狀恐怖回懦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情次企,我是刑警寧澤怯晕,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站缸棵,受9級特大地震影響舟茶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堵第,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一吧凉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踏志,春花似錦阀捅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至圆雁,卻和暖如春忍级,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伪朽。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工轴咱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓朴肺,卻偏偏與公主長得像窖剑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子戈稿,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容