1. 程式人生 > >mysql效能調優(三)——列選取原則

mysql效能調優(三)——列選取原則

1、列型別選擇

      1)整型 > data、time > char、varchar > blob

           整型、date、time運算快

           char、varchar要考慮字符集的轉換與時序的校對集,速度慢

           Blob無法使用記憶體臨時表,每次都要去磁碟找

       2)長度夠用就行

       3)避免用null:不利於索引且佔用的索引更大

       4)Enum列舉型別

create table t5(

gender enum('male', 'female') not null default 'male'

)engine myisam charset utf8;

enum在內部是用整型來儲存的

 加入新建一張表,查詢其索引

explain select * from t3 where name='a' \G                 (來檢視這個表如何使用索引)

 2、多列索引生效規則

      在講多列索引生效規則前,先解釋一下mysql的一些基本知識

     aa、 MYSQL引擎分為2中:MyISAM、InnoDB、MEMORY、MERGE

      1)MyISAM是非事務性的儲存引擎

      2)InnoDB是最流行的事務性引擎

      3)Memory儲存引擎使用存在於記憶體中的內容來建立表,為非事務性的以及非永續性的儲存引擎。每個memory表只實際對應一個磁碟檔案,格式是.frm。memory型別的表訪問非常的快,因為它的資料是放在記憶體中的,並且預設使用HASH索引,但是一旦服務關閉,表中的資料就會丟失掉。

      4)Merge儲存引擎是一組MyISAM表的組合,這些MyISAM表必須結構完全相同,merge表本身並沒有資料,對merge型別的表可以進行查詢,更新,刪除操作,這些操作實際上是對內部的MyISAM表進行的。

      對於4種引擎的更加詳細的講解可以翻看下面連結(因為我講的主要是索引)

Mysql的四種引擎介紹

       bb、MYSQL內建的儲存引擎對各種索引技術有不同的實現方式:B-樹,B+樹,R-樹以及hash雜湊型別      

       其中,B-樹是有2種節點的,一種是索引節點,另外一種是葉子節點,葉子節點是用來儲存資料的,索引節點則是用來告訴使用者儲存在葉子節點中的資料順序並幫助使用者找到對應的資料

       B+樹中底層資料是根據被提及的索引列進行排序的(即資料是排好順序的),B+樹還通過葉子節點之間的附加引用來優化掃描效能。

      B-樹與B+樹結構差不多,只不過B+樹只有達到葉子節點才命中(B-樹可以在非葉子節點命中)

      B+樹的特性:
   (1)所有關鍵字都出現在葉子節點的連結串列中,葉子節點相當於儲存資料的資料層。
   (2)不可能在非葉子節點上命中。
   (3)非葉子節點相當於是葉子節點的索引,葉子節點相當於資料層。

     cc、注意注意O(∩_∩)O哈哈~啦!重點來了

            mysql有4中引擎,但每一個儲存引擎其索引使用的資料結構是不一樣的,而不同資料結構的實現也是有不同的(B-tree在InnoDB和MyISAM中節點儲存的實際資料不同)

  InnoDB MyISAM
主碼索引 B+樹資料結構 B-樹資料結構
非主碼索引 B-樹資料結構 B-樹資料結構

InnoDB中的B-樹結構實現和MyISAM中並不一樣。在InnoDB中,非主碼索引儲存的是主碼的實際值。得到主碼 的索引值之後就可以通過主碼索引(聚簇索引檢視對應儲存的資料data)

而MyISAM中,非主碼索引儲存的包含主碼值的資料指標,查詢資料的時候就需要“回行”查詢(其主碼索引指向的也是物理行)

講了上面的內容之後,再說

 聯合索引:index(a, b, c),其索引在查詢的時候不一定要用全,但要按索引的順序來(左字首要求)

對於hash索引:hash索引是計算這行資料在哪裡很快,但讀取資料的時候很慢。因為hash計算的結果是隨機的,隨著id數量的增長,id對應的行在磁碟隨意放置,所以讀取會慢;hash不對範圍進行優化;不對排序優化;無法利用字首索引;必須回行,拿到資料位置,必須回到表中取資料

下面再補充幾個知識點:

如何優化查詢語句?

       看錶咯,是InnoDB還是myisam,InnoDB節點下掛載的是實際的資料,而myisam儲存的是物理行,再看看聯合索引、是否允許索引覆蓋(索引覆蓋是比較快的) ,建立合適的索引並且要用到位,比如:是否符合多列索引的左字首要求。用explain/profile去分析一下sql語句,儘量不要做全表掃描、不要讓其生成臨時、資料不要一次返回太多(返回太多就會寫磁碟 太慢),主鍵的使用最好是整型的並且遞增。