mysql分庫分表分區

1、當mysql單表的數據庫過大時,數據庫的訪問速度會下降,“數據量大”問題的常見解決方案是“水平切分”

2、mysql常見的水平切分方式有哪些?答:分庫分表,分區表

3、什麼是mysql的分庫分表?答:把一個很大的庫(表)的數據分到幾個庫(表)中,每個庫(表)的結構都相同,但他們可能分佈在不同的mysql實例,甚至不同的物理機器上,以達到降低單庫(表)數據量,提高訪問性能的目的。分庫分表往往是業務層實施的,分庫分表後,爲了滿足某些特定業務功能,往往需要修改代碼

4、什麼是mysql的分區表?答:所有數據邏輯上還在一個表中,但物理存儲則是根據一定的規則放在不同的文件中。這個是mysql支持的功能,業務代碼無需改動

5、看上去分區表很帥氣,爲什麼大部分互聯網還是更多的選擇自己分庫分表來水平擴展咧?

  • 分區表,分區鍵設計不太靈活,如果不走分區鍵,很容易出現全表鎖
  • 一旦數據量併發量上來,如果在分區表實施關聯,就是一個災難
  • 自己分庫分表,自己掌控業務場景與訪問模式,可控。分區表,研發寫了一個sql,都不確定mysql是怎麼玩的,不太可控

6、分庫分表後可以使用數據庫中間件如:阿里的mycat,噹噹的sharding-jdbc等來操作,水平切分規則可以使用一致性哈希算法後方便擴容,哈希算法不太利於擴容

7、下面重點介紹分區表

1、對用戶來說,分區表時一個獨立的邏輯表,但是底層其實是由多個物理表組成
2、對分區表的請求,都會通過句柄對象轉化成對存儲引擎的接口調用。所以分區對於SQL層來說是一個完全封裝底層實現的黑盒子,插入或者查詢的數據最終在哪個分區則不需要我們關心,mysql已經幫我們做了
3、在執行查詢的時候,優化器會根據分區時定義的分區字段或者分區方式來過濾哪些沒有我們需要數據的分區,這樣查詢就無需掃描所有分區,只需要查找包含需要數據的分區就可以了。

8、分區原理

分區表是由多個相關的底層表實現,這些底層表也是由句柄對象表示,所以我們也可以直接訪問各個分區,存儲引擎管理分區和一個普通表沒有任何不同,存儲引擎也無須知道這是一個普通表是分區表的一部分。

在分區表上的操作是按照下面的操作邏輯進行:
select 查詢:
當查詢一份分區表的時候,分區層先打開並鎖住所有的 底層表,優化器判斷是否可以過濾部分分區,然後再調 用對應的存儲接口訪問各個分區。
insert操作
當寫入一條記錄時,分區層打開並鎖住所有底層表,然後確定那個分區接受這條記錄,再將這條記錄寫入對應的底層表
delete操作
當刪除一條記錄是,分區層先打開並鎖住所有底層表,mysql先確定對象分區,最後對相應的底層表進行刪除操作。
update操作
當更新一條數據時,分區層先打開並鎖住所有的底層表,mysql先確定更新的記錄再哪個分區,然後取出數據並更新,在判斷更新後的數據應該放在哪個分區,然後對底層表進行寫入操作,並對原數據的底層表進行刪除操作

9、分區限制

A:一個表最多只能有1024個分區(mysql5.6之後支持8192個分區)
B:在mysql5.1中分區表達式必須是整數,或者返回整數表達式,在5.5之後,某些場景可以直接使用字符串和日期類型列進行分區
C:如果分區字段中有主鍵或者唯一索引列,那麼所有主鍵列和唯一索引列都必須包含進來,如果表中有主鍵或唯一索引,那麼分區鍵必須是主鍵或唯一索引。
D:分區表中無法使用外鍵約束
E:mysql數據庫支持的分區類型爲水平分區,並不支 持垂直分區,因此,mysql數據庫的分區中索引是局部分區索引,一個分區中既存放了數據又存放了索引,而全局分區是指的數據庫放在各個分區中,但是所有的數據的索引放在另外一個對象中
F:目前mysql不支持空間類型和臨時表類型進行分區。不支持全文索引

10、分區類型

分區類型 說明 使用頻率
range 對連續的值進行分區,例如日期,年月 較高
list 基於列值匹配一個離散值集合中的某個值來進行選擇 一般
hash 分散熱點讀取,確保數據在預定確定個數分區中儘可能的平均分佈 較多
key 類似於hash分區,區別在於KEY分區支持只支持計算一列或多列,且MySQL服務器提供自身的哈希函數。必須有一列或多列包含整數值 一般

11.分區表效率問題


1、當查詢訪問分區表的時候,MySQL需要打開並鎖住所有的底層表,這是分區表的一個開銷。這個操作在分區過濾之前發生,所以無法通過分區過濾降低此開銷,並且該開銷也和分區類型無關,會影響所有的查詢
2、然後根據分區字段(比如使用主鍵作爲分區字段)篩選出來符合條件的分區,然後在篩選出來的分區上在通過索引進行查找數據,最後通過條件篩選出滿足的結果集
3、如果定義的索引列和分區列不匹配,會導致查詢無法進行分區過濾。假設在A列上定義了索引,而在B列上進行分區。因爲每個分區都有其獨立的索引,所以掃描B列上的索引就需要掃描每一個分區內對應的索引。要避免這個問題,應該避免建立和分區列不匹配的索引,除非查詢中還同時包含了可以過濾分區的條件

 12、分區表查詢優化

1、分區最大的優點就是優化器可以根據分區函數(分區字段)來過濾一些分區。根據粗粒度索引的優勢,通過分區過濾通常可以讓查詢掃描更少的分區,而不至於查詢所有分區。
2、對於訪問分區表來說,很重要的一點是要在where條件中帶入分區列,有時候即使這個例很多餘的也要帶上,這樣就可以讓優化器能夠過濾掉無需訪問的分區。如果沒有這些條件,MySQL就需要讓對應存儲引擎訪問這個表的所有分區,如果表非常大的話,就可能會非常慢。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章