《高性能MySQL》のMySQL高級特性

0x00前言

本書講述到定稿前的MySQL5.5版,因此下面內容的適用範圍止步於MySQL5.5。本文僅僅強調書中講述的重中之重, 以便快速查閱,詳細的內容還請認真閱讀書本和MySQL的官方文檔。java

0x01簡介

本章討論了MySQL的分區表,視圖,外鍵,存儲過程,綁定變量,插件,字符集,全文索引,XA事務,查詢緩存。node

0x02具體

分區表

適用於大數據量的過濾場景,或者數據分爲歷史數據和熱點數據,對於單條記錄的查詢並無多少優點。算法

原理

經過句柄對象轉化成對存儲引擎的接口調用,對於SQL層是徹底封裝底層實現的黑盒子。 CURD操做都會先代開並鎖住全部的底層表,而後在解鎖不須要的表。因此並非在處理過程當中都鎖住表。sql

適用條件

  • 表很是大,或者表的最後部分是熱點數據,其他是歷史數據。
  • 想大批量地刪除數據,可使用清除整個分區的方式。
  • 分區表能夠分佈在不一樣的物理設備上。
  • 避免某些特殊瓶頸。如ext3文件系統的inode鎖競爭。
  • 能夠備份和恢復獨立的分區。

<!-- more -->數據庫

限制和性能問題

  • 所用分區都必須使用相同的存儲引擎。
  • 有些存儲引擎不支持分區。
  • 在建立分區時可使用表達式,但在查詢時卻只能根據列來過濾分區。
  • 分區列和索引列不匹配。
  • 選擇分區成本的成本很高時。
  • 打開並鎖住底層表的成本很高時(若自己查詢操做是快速的)。

視圖

簡化應用程序的SQL語句編寫(諸如表聯結),或者使用視圖實現基於列的權限控制,重構schema等。緩存

原理

  • 臨時表算法 先執行視圖的查詢語言生成臨時表,再經過臨時表執行查找。視圖中包含GROUP BY、DISTINCT、任何 聚合函數、UNION、子查詢等,只要沒法在原表記錄和視圖記錄中創建一一映射的場景時,只能採用臨時表算法。
  • 合併算法 將定義視圖的語句與查詢語句合併,進行一次查詢操做。

性能影響和缺點

  • 臨時表沒有索引。
  • 不支持物化視圖。
  • 有些狀況視圖不能夠被更新(包括更改聯接鍵,視圖定義使用聚合函數等)。
  • MySQL目前不支持觸發器。

外鍵

爲確保系統完整性的額外特性,會帶來較高地效率代價,外鍵致使的死鎖問題難以排查。若是要設計高性能系統, 建議經過應用程序而不是外鍵來維護數據的完整性。安全

存儲過程

存儲過程和存儲函數均可以接收參數而後返回值,觸發器和事件卻不行。 能夠節省不少網絡開銷,也能夠操縱一些沒有權限的表,可是bug較多,使用時要慎重考慮。服務器

綁定變量

對於大量重複類型的查詢語句,性能會有很大的提高。通常來講,利大於弊,使用還能保證必定的安全性。網絡

優勢

  • 在服務器端只須要解析一次SQL語句。
  • 某些優化器的工做只須要執行一次。
  • 以二進制方式只發送參數和句柄,比起每次都發送ASCII碼文本效率更高。

代碼樣例

public boolean insert(User user){
        boolean flag=true;
        Connection conn=null;
        PreparedStatement ps=null;
        String sql="update user set pwd=? where name=?";
        conn=DBConnUtil.getConn();
        try {
            ps=conn.prepareStatement(sql);
            ps.setString(1, user.getPwd());
            ps.setString(2, user.getName());
            int i= ps.executeUpdate();
            if(i==0){
                flag=false;
            }  
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DBConnUtil.closeAll(null, ps, conn);
        }
        return flag;
}

插件

用C或C++編寫插件來擴展MySQL的功能,極客所爲。函數

字符集

數據庫,表間的字符集最好統一,可是是否使用UTF-8看狀況而定。

全文索引

最好使用Lucene、Sphinx來解決全文索引問題。

XA事務

除非真正明白XA事務,不然不要輕易更改默認配置。

查詢緩存

真正須要查詢緩存時才使用,不然不要使用。使用時不要設置太大的緩存內存。 若是但願有更高的緩存效率,最好在應用程序提供緩存。

適用條件

  • UPDATE、DELETE和INSERT操做相比SELECT來講很是少時。
  • 被緩存的查詢自己消耗巨大,即便緩存命中率很是低,也仍然會對系統性能提高有好處。

0x04小結

以上的高級特性都不是萬能藥,使用時要充分用與不用的測量,還包括考慮當前數據庫的版本。

引用

《高性能MySQL · 第三版》

相關文章
相關標籤/搜索