mysql優化整理(索引)

什麼是索引?

索引是表記錄的單個或多個字段從新組織的一種方法,其目的是提升數據庫的查詢速度,本質上就是一種數據結構。
索引的類型:primary(主鍵)、secondary(其餘)html

索引的數據結構

  • Innodb primary key
    Innodb primary key
    物理文件:
    物理文件存儲方式sql

  • Innodb secondary key
    Innodb  secondary key數據庫

索引的優缺點

  • 優勢
    在大數據前提下,多數狀況都會加快查詢的速度
  • 缺點
    每次的數據的更新、刪除以及插入操做都須要對索引進行額外的維護,因此須要謹慎的建立索引,建立索引不是萬能的,後面會介紹一些簡單的技巧

小技巧

  • 索引列都有default值
    這個的主要問題是,數據庫存儲的數值存在數據類型轉換的問題,若是有默認值,就能夠達到快速區別的做用。
  • 控制好索引長度
    通常狀況下,索引的字段只會存儲255個字符長度,若是超出這部分以外的,其實做用不是很大,因此建立索引的字段長度最好是255之內的長度。
  • 索引列的分組排序
    對於建立索引的字段進行分組處理,使用union進行合併
  • like語句的優化。
    使用like的語句首先能夠建立索引,其次儘可能避免使用雙百分號(%),儘可能使用一個%完成,這樣能夠提高速度。
  • 不在索引列上進行運算
    不要對字段進行計算後查詢(避免將計算寫在等號左邊,能夠換一種寫法放在等號右邊)。
  • 不使用NOT IN和!=操做
    對於使用not in或者!=的查詢語句,儘可能使用in寫法。
  • 注意隱式轉換的問題
    和第一條差很少,咱們存儲的字段類型最好和咱們查詢語句的字段類型保持一致,這樣能夠提高訪問速度。
  • 建立組合索引能夠將經常使用字段放在最左,這樣單個查詢條件也能夠使用索引

再度整理

  • 建立合理的索引或者組合索引
  • 改寫語句,對於沒有建立索引的語句,能夠使用其餘形式轉換成具備索引的查詢語句
  • 鏈表查詢時,最好使用inner形式或者是union合併;另外最好把條件限制到最低,這樣符合要求的語句就會更少,查詢速度會更快。
  • 減小併發量
    有時候發現單個執行很快,多個併發執行會有這個問題。
  • 縮小查詢範圍
    好比使用in的時候,in裏面字段最多不超過20個,limit也須要減小個數。
  • 使用主、從庫,進行讀寫分離
  • 其餘的可能須要檢查機器自己的問題了:內存、磁盤等等。

其餘

查看是否使用索引方式:能夠使用 explain + sql語句,查看所查詢的語句是否使用了建立的索引,進而優化本身的索引建立。服務器

  • 未建立索引的查詢
    未建立索引

主要字段說明:select_type(簡單查詢)、table(表名)、type(索引類型)、prosible_key(可能的索引字段)、key(使用到的索引字段)、key_len(索引字段長度)、rows(查詢行數)、Extra(額外信息)數據結構

  • 建立索引的查詢
    我這裏建立了idx_appid_userid的組合索引,進行查詢以後:
    建立索引

咱們能夠發現以前的字段值發生了變化,能夠看出來使用了咱們建立的索引,額外信息中也提到使用到了索引條件。併發

使用上述方式進行優化後,以前整理過的記一次pending請求問題查找過程,有很大的改善,不過這個優化須要一直跟進。app

小結

整體的原則就是:盡最大的努力,結合業務狀況,減小數據庫服務器的I/O,便可大幅度提高服務器的速度。大數據

本文主要參考#高級DBA李丹的分享,再加上一些實戰整理而成,因爲是初步接觸數據庫相關的東西,有描述不許確的歡迎指正。另外,若是有其餘好的方案也能夠推薦給我,不勝感激~優化

相關文章
相關標籤/搜索