Mysql優化

1、Mysql的邏輯架構mysql

 

2、存儲引擎sql

Mysql5.5以前,默認存儲引擎是MyISAM,5.5以後默認存儲引擎變成 InnoDB
 
    MyISAM和InnoDB的區別:
    1)MyISAM不支持事務、InnoDB支持事務
    2)MyISAM只有表鎖、InnoDB引入了行鎖
    3)MyISAM支持全文索引、InnoDB 5.5不支持,5.6之後支持    
    4)MyISAM的讀寫速度會優於InnoDB

3、MySQL優化(SQL優化)數據結構

    · 數據類型的優化(建立表的時候,選擇合適的數據類型)
    · 索引優化(SQL優化成本最低而且最有效果的優化方式)
    · 查詢優化(SQL自帶的檢測工具、SQL結構)
    · 庫表結構優化(分庫分表、讀寫分離)
    · 硬件優化(cpu、固態硬盤、內存)
    · 參數優化(系統運行參數)- DBA
 
4、數據類型的優化
 
    數據類型的選擇原則:
    · 選擇最小的數據類型,同時須要保證可以放下所存儲的數據
    · 選擇最合適的數據類型,好比使用int表示年齡,而是否是varchar表示年齡
    · 儘可能讓須要添加索引的列爲not null
 
5、索引優化
 
    什麼是索引?
    索引是一本書的目錄,能夠快速找到相應的內容。
    索引是一個幫助咱們快速查詢內容的 數據結構
 
  無索引的查詢方式:

 

有索引的查詢方式:架構

 

 

索引失效:工具

當寫了一個索引後,開發者認爲執行的sql會用上該索引,可是實際上Mysql沒有使用該索引,這種狀況就是索引失效。性能

 

索引的底層原理
        
        Mysql的MyISAM和InnoDB兩大存儲引擎底層的索引結構採用的都是B+Tree索引。
 
        爲何MySQL不採用查詢速度更快的哈希表所謂索引結構呢?
            哈希表只支持精準查詢,可是範圍查詢無能爲力,相對來講,SQL語句有可能會出現大量的範圍查詢,這種狀況下,哈希索引就會失效,變成全表掃描。
 
        爲何MySQL不採用搜索性能很棒,而且也支持範圍查詢的數據結構 - 紅黑樹?
 
        BTree的結構:
            
        B+Tree的結構:
            
                B+Tree的升級:
                1)全部的非葉子節點,都會出如今葉子節點上
                2)全部的葉子節點之間會造成一個雙向鏈表
 
MySQL建立索引
 
       
            問題:
            1)多列索引在底層會生成幾顆索引樹? - 1顆(全部列都在一顆B+Tree上)
            2)多列索引列的順序有沒有關係?- 列的順序很重要,不一樣的順序會致使索引的做用不一樣
        
            注意:惟一索引會保證當前字段數據不會重複,可是又可能爲null,並且有可能有多個null
 
 
 
模擬一個底層索引結構的建立過程(重要):
 
        複合索引的底層B+Tree結構,會按照最左邊的字段進行排序,當第一個字段相同的時候,再根據第二個字段排序,以此類推...
        
        select * from student where name = "xxx" : 可以用上上述的索引(由於索引樹是根據name排列)
        select * from student where age = xxx:不能用上上述的索引(由於索引樹不能根據age排列)
        select * from student where name = "xxx" and age = xxx:完美用上上述的索引
 
        select * from student where name like "%明%":不能用上上述索引的
        select * from student where name like "8%":能用上索引的
 
        select * from student where name > "2百五" and age = 8:name能用上索引,age不能用上索引
        select * from student where name = "2百五" and age > 8: name和age都完美的用上了索引
 
 
聚簇索引:
 
    什麼是聚簇索引?
    InnoDB類型的表,主鍵索引就是聚簇索引。MyISAM類型的表,主鍵是非聚簇索引。
    

 

 
    二級索引的查詢方式:
    

 

 
    注意:根據InnoDB聚簇索引的特色,在InnoDB類型的表中,MySQL推薦咱們必定要提供一個和業務無關而且自動增加的字段做爲表的主鍵。
    
    若是InnoDB中的表沒有主鍵怎麼辦?
    若是一張表沒有主鍵,則MySQL會選擇一列惟一性索引的列做爲聚簇索引。若是表中沒有一列上面有惟一性索引,則MySQL會自動的建立一個隱性的列,做爲聚簇索引。
 
覆蓋索引:
 
    什麼是覆蓋索引?
    就是查詢的字段,在索引中就有保存,這種方式,就避免了查詢完索引後,返回表中獲取數據,性能會獲得必定的提高。
 
 
6、 執行計劃
 
    什麼是執行計劃?
    一個Sql語句在通過優化器以後,會生成一個執行計劃,這個執行計劃就決定了MySQL最終如何執行這條SQL語句。因此分析一條SQL語句的執行計劃,一般是優化這個SQL語句的第一步。
 
    如何查詢一個SQL的執行計劃?
    explain (查詢)sql語句
    
    字段的含義:
        id:標識當前執行的sql語句的順序
            · id值相同的狀況:若是id值相同,說明執行計劃的順序是從上到下
            · id值不一樣的狀況:若是id值不一樣,id值比較大的執行計劃優先級更高
            · id值相同不一樣同時存在:先看id大的,id相同的從上到下
            · id爲null:若是id爲null則表示這部分最後執行
    
            注意:MySQL中的關聯原則,小表驅動大表
 
        select_type:查詢類型
            · simple:說明當前的查詢是一個簡單查詢            
            · primary:若是一個sql語句中間包含了子查詢,則外層查詢就會變成primary,primary標記的部分也能夠理解成爲最後執行的部分
            · subquery:select或者where後面出現的子查詢會被標記爲subquery
            · derived(衍生):標記出如今from後面的子查詢
            · union:union關鍵字後面的sql語句會被標記爲該類型
 
 
            mysql對查詢的分類:
            · 簡單查詢:沒有子查詢和union的查詢語句
            · 複雜查詢:包含了子查詢和union的查詢語句
 
        type(重要):表示當前SQL是根據什麼方式訪問數據行的
            ·  all:說明當前查詢數據的方式採用的是 全表掃描
            ·  index:說明當前查詢是一個 全索引掃描,效果和全表掃描差很少,只是說根據索引樹的結構進行了所有的掃描,性能比all稍微好一些(不是絕對的)
            · range:說明當前的查詢是一個 索引的範圍查詢,說明當前沒有走完整個索引,只走了索引的一部分
            ·  ref:說明當前的查詢時一個精準的非惟一性的查詢,查詢了索引的一小部分,一般出如今對非惟一性的索引的查詢上
            ·  eq_ref:說明當前的查詢是一個精準的惟一性查詢,一般出如今惟一性索引、主鍵索引以及鏈接查詢上
            ·  const:說明當前的查詢將條件轉換成一個常量執行,一般出如今惟一性索引和主鍵索引的精準查詢上
            ·  system:是const的一種特殊狀況,表示進準查詢了惟一性索引或者主鍵索引而且mysql保證數據集只有一條記錄
            ·  null:這種狀況說明當前的sql語句都不用進行查詢,在解析的時候就可以得到結果
 
        rows(重要):表示MySQL預估的當前SQL須要讀取到的數據行數,這個值越小越好
 
        possible_keys:表示可能運用在這個查詢上的索引
 
        keys(重要):表示當前真正用上的索引
            注意:有可能發生這種狀況,possible_keys裏面有索引,可是keys爲null;possible_keys爲null,可是keys不爲null;
 
        Extra(重要):表示一些額外的信息,展現的地方
            · Using Index:說明發生了覆蓋索引
            · Using temporary:說明查詢語句用上了臨時表,儘可能避免(並非看到了就必定要避免)
            · Using filesort:說明當前發生了文件外排序(有可能在內存中排序,有可能用上了磁盤排序)
相關文章
相關標籤/搜索