Mysql-優化篇

mysql的優化實在太多,這裏僅僅列一些常見的,不可能徹底歸納,後續有新學習的內容會持續更新。mysql

explain 分析select語句

主要字段
select_type查詢類型 eg:SIMPLE 簡單查詢,UNION 聯合查詢,SUBQUERY 子查詢
table 查詢的表
partitions:
type 索引查詢類型 const:使用主鍵或者惟一索引進行查詢的時候只有一行匹配 ref:使用非惟一索引 range:範圍查詢 all:掃描全表 index:和all的區別是掃描的是索引樹 system表只有一行或空表,const的特例 fulltext:全文索引,優先級很高 等等
possible_keys 可能用到的索引
key 實際使用的索引
key_len 查詢用到的索引長度(字節數)
ref 等值查詢會顯示const
rows 掃描的行數
filtered 表示存儲引擎返回的數據在server層過濾後,剩下多少知足查詢的記錄數量的比例
extra :算法

  • Using index 查詢不須要回表,而且where篩選條件是索引的是前導列
  • Using where Using index 查詢不須要回表,而且where篩選條件是索引列之一可是不是索引的不是前導列,或者是前導列的一個範圍查找
  • NULL 查詢須要回表,而且where篩選條件是索引的前導列
  • Using where 查詢須要回表,where篩選條件非索引的前導列,或者篩選條件非索引列
    等等

索引優化

(1)創建聯合索引,講選擇性強惟一性高的字段放在前面,範圍查找字段放在最後
(2)索引覆蓋,儘可能避免回表
(3)合理利用前綴索引,避免長字段索引過長,佔用空間sql


索引下推ICP

這是mysql5.6版本以後內部對於索引過濾數據作的優化,適用於好比範圍查詢,模糊查詢,由於最左前綴原則,致使聯合索引失效的狀況。之前的查詢都是在存儲引擎層先返回條件字段索引相關的數據,而後直接回表,在server層再對where後失效的索引查詢條件進行過濾,在5.6以後,在引擎層會對where索引條件進行篩選,進一步減小了對記錄的過濾(用通俗的話就是5.6版本以前聯合索引中失效的索引字段會回表再去判斷,ICP會讓判斷條件從服務層下推至存儲引擎層,對失效的索引字段在存儲引擎層進行判斷)。此時explain select語句的extra爲Using index condition(查找使用了索引,而且須要回表查詢數據)。數據庫


讀寫分離

將數據庫分爲主表和從表,主表做爲寫表,用於處理數據增刪改和數據表操做,而從表做爲讀表通常會有多個,用於同步主表的修改,而且處理讀操做。
主表master和從表slave經過binlog來同步。咱們知道,對於主表的修改會寫入binlog,此時主表會開啓一個binlog dump線程,將修改的binlog發送給從表的IO線程,從表會將binlog寫入relay log,以後sql線程會將修改的部分同步到從表。分佈式

讀寫分離帶來的主從表數據不一致問題怎麼解決?
能夠採用 1.從主表讀取未同步的數據 2.延遲讀 等等方法。學習


分庫分表

分表優化

  • 垂直分表
    按照字段進行分表,使用頻率高的字段放在一張表,使用頻率低的放另外一張表,同時,兩張表都要有相同的主鍵id。
    垂直分表的意義在於,表的最大尺寸是和字段數相關的,若是垂直拆分字段成不一樣的表,字段數降低了,表的最大尺寸則變大了,能容納更多數據。
  • 水平分表
    根據一個規則或字段(分片鍵)將數據分到不一樣的表裏,保證全部表的字段都相同,數據均勻劃分。

分庫線程

  • 業務模塊分庫
    根據不一樣的業務模塊來分庫,將不一樣業務的數據庫操做分隔開來
  • 按表分庫
    對於上述水平分表產生的多個子表來講,能夠將不一樣的子表分到不一樣的數據庫中

分庫分表也會帶來一些問題,好比:設計

  • 不一樣庫表關聯查詢問題
    首先設計初須要避免這種狀況,若是出現這種狀況
    1.設計冗餘字段,避免跨庫的join
    2.添加全局表,保存一些全局數據等不多修改的數據
  • 分佈式事務問題
    基於兩階段提交的XA事務
  • 分佈式id問題
    能夠利用雪花算法,或者專門的id生成服務解決
  • 數據擴容
    因業務量增長鬚要增長子表,這個時候須要從新設置分片規則,而且作數據遷移,保證數據均勻分佈
  • 跨表排序分頁
    分片鍵做爲排序字段,則正常使用排序;反之,則須要在不一樣子表中分別查詢結果並彙總,再次排序
  • ER分片
    對於一些關聯表,能夠合理設置它們的分片字段,使得相同分片數據的表在同一個數據分片上,避免跨庫join。好比員工表和公司表,假設他們以公司id關聯,能夠以公司id來分片,這樣能保證同一個庫內,公司表和員工表的公司id都是同樣的。

此外,這些問題能夠利於一些市面上成熟的中間件來解決,好比ShardingSphere,mycat,Sharding-JDBC,DRDS等等。server

相關文章
相關標籤/搜索