mysql的高級特性

一、分區表
  1)分區表是一個獨立的邏輯表,底層是由多個物理字表組成。實現分區的代碼其實是對一組底層表的句柄對象的封裝,對分區表的請求都會經過句柄對象轉化爲對存儲引擎的接口調用,因此分區對於SQL層來講是一個徹底封裝底層實現的黑盒子,對應用是透明的。
  2)Mysql實現分區後,索引是按照分區的字表來定義的,沒有全局的索引。
  3)注意幾點:
    - 一個表最多隻能由1024個分區;
    - Mysql5.1中分區的表達式必須是整數或者返回值爲整數,在Mysql5.5中能夠直接使用列來盡心個分區;
    - 若是分區字段中由主鍵或者惟一索引的列,那麼全部主鍵和惟一索引列都必須包含進來。
    - 分區表中沒法使用外鍵約束。
  4)第一個分區是特殊分區,在分區的表達 PARTITION BY RANGE (to_days(var)) 中var的值爲null或者非法值時,記錄都會存放在第一個分區,爲了不第一個分區太大致使檢索效果不好,通常第一個分區能夠設置PARTITION BY RANGE (to_days(0)),若是var的值都是有效的,第一個分區就是空,即便無效第一個分區的數據量也會很小。
 
二、視圖
  Mysql 5.0版本後纔開始引入視圖。視圖自己是一個虛擬表不存聽任何數據。在使用SQL語句訪問視圖的時候返回的是Mysql從其餘表中生成的,視圖和表是在一個命名空間,不一樣對視圖建立觸發器也不能使用DROP TABLE命令刪除視圖。
建立一個視圖:

  視圖有兩種實現:合併算法和臨時表算法,若是可能會盡量使用合併算法,只有在視圖中包含GROUP BY、DISTINCT、聚合函數、UNION、子查詢等,沒法在原紀錄和視圖創建一一映射的場景中,Mysql都會使用臨時表來實現視圖,也可使用EXPLAIN對視圖肯定是用哪一種實現方法。
這裏的select_type爲「DERVIED」代表該視圖採用的是臨時表算法實現的。對於使用了臨時表算法的視圖沒法更新數據的。
  
下圖是兩種表的實現算法:
 
三、Mysql內部存儲代碼
  Mysql容許經過觸發器、存儲過程和函數的形式來存儲代碼。從Mysql5.1開始能夠在定時任務中存放代碼,這個定時任務也稱爲「事件」。
  存儲過程:
    - 每一個鏈接都有獨立的存儲過程的執行計劃緩存
    - 存儲程序越小越簡單越好,更復雜的邏輯還須要交給上層的應用實現。
    - 使用存儲過程對於一些小的查詢或者插入操做優點很明顯,相對於應用層面減小執行成本、解析和網絡開銷,因此通常對於測試環境造大量數據能夠考慮存儲過程來實現。
 四、主從數據複製
  1)mysql支持兩種複製方法:基於行的複製和基於語句的複製。這兩種複製方式都是經過在主庫上記錄二進制日誌,在備庫重放日誌的方式來實現數據異步同步。
  2)數據複製的步驟:
    - 主庫上把數據更改記錄到二進制日誌(Binary Log)中。在每次準備提交事務完成數據更新以前,主庫將數據更新的事件記錄到二進制日誌中。Mysql是按照事務的提交順序而非每條語句的執行順序來記錄日誌,只有記錄完畢日誌後纔會提交事務。
    - 備庫將主庫上的日誌複製到本身的中繼日誌(Relay Log)中。備庫會啓動一個I/O線程跟主庫創建鏈接,而後在主庫上啓動一個特殊的二進制轉儲(binlog dump)線程。這個二進制轉儲線程會讀取主庫上二進制日誌中的事件。它不會對事件進行輪詢,若是該線程追上主庫將進入睡眠狀態,直到主庫發送信號通知有新的事件纔會喚醒,備庫I/O線程會將接收到的事件記錄到中繼日誌中。
    - 備庫的SQL線程執行最後一步,該線程從中繼日誌讀取事件並在備庫上執行,從而實現備庫數據的更新。
  以下圖因此,在主庫中有一個二進制轉儲線程,從庫中有兩個線程:I/O線程從主庫讀取二進制到中繼日誌和SQL執行線程。
 
相關文章
相關標籤/搜索