從SQL Server到MySql(6) : Mysql 索引優(yōu)化和維護

1. 索引的優(yōu)化

1.1 支持多種過濾條件

  • 考慮表上所有的選項
    • 通用的原則: 盡量在選擇性高的列上做索引.
    • 例外: 對于經常被作為條件的列, 如性別, 最好還是對它創(chuàng)建索引.
    • 設計索引時, 不要?只從現在的查詢考慮, 還要考慮對查詢進行優(yōu)化.
    • 如果為某些查詢創(chuàng)建的索引, 會導致另一些查詢的銷量降低. 應該考慮優(yōu)化查詢.
  • 盡可能重用索引而不是建立大量的組合索引
    • 例如: 查詢中可能需要(sex, country, age) 和(sex, country, region, age) 這兩種索引.
    • 限制: Mysql 只能匹配索引的最左前綴.
    • 做法: 只建立(country, region,sex, age) 一個索引.
      • 在需要使用到(country, region, age) 索引的查詢中, 在where 條件中加入 And sex in ('m','f');
    • 局限: 每額外增加一個IN() 條件, 優(yōu)化器需要做的組合就以指數級增加.
      • 當列過多時, 很可能會大大地降低了查詢性能.
      • 老版本的MySql 在IN()組合條件過多時會有很多問題, 如查詢優(yōu)化耗時且浪費內存.
      • 而新版本在組合數超過一定數量后, 就不再進行執(zhí)行計劃評估了, 從而導致Mysql 不能很好地利用索引.
  • 盡可能將需要做范圍查詢的列放到索引的后面
    • 例如: age 這類經常被用來作范圍條件(18~25) 的列.
    • 限制: 查詢只能使用索引的最左前綴, 直到遇到第一個范圍條件列.
    • 做法: 可以使用IN() 來替代范圍查詢, 但是并不是所有的范圍查詢都適用.

1.2 避免多個范圍條件

  • 列表和范圍查詢
    • 列表查詢: IN(1,3,5) ; 范圍查詢: id>45.
    • Mysql 區(qū)分不來這兩種類型, explain 的結果中type 字段都為range.
    • 但是, Mysql 不能再使用范圍列后面的其他索引, 而對于列表查詢沒有這個限制.
    • 在遇到有連續(xù)的范圍查詢時, 設法把除最后一列外的范圍列查詢轉化為列表查詢.
    • 未來: 如果Mysql 實現了松散索引掃描, 那么就能在一個索引上使用多個范圍條件. 也就不需要該技巧.

2. 維護索引和表

2.1 找到并修復順壞的表

  • 損壞的索引會導致查詢返回錯誤的結果或者莫名的主鍵沖突等問題.
    • 當遇到古怪的問題時, 使用Check Table 來檢查是否有表損壞.
    • 如果有表損壞, 使用Repair Table 來修復表.
    • 如果引擎不支持修復命令, 通過一個不做任何操作(no-op) 的Alter 操作來重建表, 也可以達到效果.
    • 如果遇到數據損壞, 重要的是要找出是什么原因導致了損壞, 而不是簡單地修復. 否則損壞很可能再次發(fā)生.

2.2 更新索引統(tǒng)計信息

  • Mysql 優(yōu)化器通過兩個API 來了解存儲引擎的索引值分布情況, 來決定如何使用索引.
    • records_in_range() 返回一個范圍內的記錄數.
    • info() 返回各種類型的數據, 包括索引的基數(鍵值的記錄數).
  • 如果存儲引擎提供的掃描行數信息是不準確的. 優(yōu)化器會使用索引統(tǒng)計信息來估算掃描行數
    • 優(yōu)化器基于成本模型, 成本的核心指標是查詢需要掃描的行數.
    • 如果沒有統(tǒng)計信息,或者信息不準確, 優(yōu)化器很可能做出錯誤的決定.
    • 通過Analyze Table來重新生成統(tǒng)計信息.
  • 每種存儲引擎的索引統(tǒng)計信息實現方式都不同, 所以需要重新生成的頻率和成本也不同.
    • MyISAM 將統(tǒng)計信息存儲在磁盤中, 重新生成需要進行一次全索引掃描來計算索引基數, 過程中會鎖表.
    • InnoDB 不在磁盤存儲索引統(tǒng)計信息, 而是通過隨機的索引訪問進行評估并存儲在內存中.
    • Show Index From 來查看索引的基數.
    • 索引的統(tǒng)計信息會在一些情況下自動更新, 如果數據量較大時,可能會造成性能問題.
      • 關閉自動更新后, 需要周期性地運行Analyze Table 來手動更新. 否則會出現糟糕的執(zhí)行計劃.

2.3 減少索引和數據的碎片

  • B-Tree 索引可能會碎片化, 這會降低查詢的效率.
    • 碎片化的索引會議很差或無序的方式存儲在硬盤上.
  • 表的數據存儲也可能碎片化.
    • 行碎片. 數據行被存儲在多個片段中.
    • 行間碎片. 邏輯上順序的頁或行, 在硬盤上不是順序存儲的.
    • 剩余空間碎片.頁中的剩余空間會造成浪費.
  • 通過Optimize Table 或導出再倒入的方式重新整理數據.
    • 對于不支持上述命令的存儲引擎, 通過一個不做任何操作的Alter 操作來重建表.

3. MICS

  • 三個原則
    • 單行訪問是很慢的. 讀取的塊應該包含盡可能多所需要的行.
    • 按順序訪問范圍數據是很快的.
    • 索引覆蓋查詢是很快的.
  • 像 NOW() 和 RAND() 或是其它的諸如此類的SQL函數都不會開啟查詢緩存泽论,因為這些函數的返回值時不定的易變的.
  • 當只要一行數據時使用limit 1.
    • 優(yōu)化: 數據庫引擎會在找到第一條數據后立即停止搜索.
  • 為經常用來做搜索的字段建立索引.
  • 表join 時兩邊的列應該擁有相同的類型,并且是被建立過索引的.
  • 永遠為每張表設置一個ID.
    • 即使該表已經有唯一的字段. int 自增的ID 性能更好.
    • 關聯(lián)表的外鍵是個例外.
  • 把IP 地址存儲unsigned int.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末漓库,一起剝皮案震驚了整個濱河市亦鳞,隨后出現的幾起案子晨抡,更是在濱河造成了極大的恐慌项滑,老刑警劉巖见剩,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件期揪,死亡現場離奇詭異唐础,居然都是意外死亡悟衩,警方通過查閱死者的電腦和手機剧罩,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來座泳,“玉大人惠昔,你說我怎么就攤上這事√羰疲” “怎么了镇防?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長潮饱。 經常有香客問我来氧,道長,這世上最難降的妖魔是什么饼齿? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任饲漾,我火速辦了婚禮,結果婚禮上缕溉,老公的妹妹穿的比我還像新娘考传。我一直安慰自己,他們只是感情好证鸥,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布僚楞。 她就那樣靜靜地躺著,像睡著了一般枉层。 火紅的嫁衣襯著肌膚如雪泉褐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天鸟蜡,我揣著相機與錄音膜赃,去河邊找鬼。 笑死揉忘,一個胖子當著我的面吹牛跳座,可吹牛的內容都是我干的端铛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼疲眷,長吁一口氣:“原來是場噩夢啊……” “哼禾蚕!你這毒婦竟也來了?” 一聲冷哼從身側響起狂丝,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤换淆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后几颜,有當地人在樹林里發(fā)現了一具尸體油昂,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡粱胜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年势木,在試婚紗的時候發(fā)現自己被綠了鄙煤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡具壮,死狀恐怖,靈堂內的尸體忽然破棺而出哈蝇,到底是詐尸還是另有隱情棺妓,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布炮赦,位于F島的核電站怜跑,受9級特大地震影響,放射性物質發(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

推薦閱讀更多精彩內容