天天看點

MySQL 性能調優——資料庫的分庫分表 1. 資料庫分片2、資料庫分片前的準備:

随着業務的不斷增長,資料庫中的資料也會越來越多,資料庫的壓力會越來越大,我們會發現,在業務繁忙的時候,資料庫的性能會直線下降,這時為了保證良好的性能,需要想辦法分擔資料庫的壓力。分擔資料庫的讀負載可以使用主從複制的方式,增加隻讀從資料庫,通過讀寫分離的方式把資料庫的讀負載分擔到不同的從資料庫中,這時在一段時間内已經可以解決問題了。随着業務的發展,會發現,單一的主資料庫已經無法承擔寫負載了,那麼這時就需要對單一的主資料庫進行拆分了,通常來說,對主資料庫的拆分有下面幾種方式:

(1)把一個執行個體中的多個資料庫拆分到不同的執行個體;

(2)把一個庫中的表分離到不同的資料庫中;

1. 資料庫分片

為了解決上面的問題,我們需要對一個庫中的相關表進行水準拆分到不同執行個體的資料庫中,即需要進行分片處理,我們通常所說的分庫分表,大多數情況下指的就是這種方式。

資料庫分片後,資料通常是存放在不同的實體節點上,資料庫的分片并不像我們前面所說的第二種分庫分表的方式容易實作,要對原來一個獨立的資料庫進行分片,我們需要考慮很多問題,通常來說,不是萬不得已,不建議對資料庫進行分片。分片後資料庫會變得難以維護。

例如對訂單表進行分片,會将訂單表分成多個相同表結構的訂單表,多個訂單表可能會分布在不同的實體節點中:

MySQL 性能調優——資料庫的分庫分表 1. 資料庫分片2、資料庫分片前的準備:

2、資料庫分片前的準備:

在進行資料庫分片前,最重要的一項工作就是如何選擇分區鍵。分區鍵決定了我們如何對資料庫進行分片,以及分片後如何查詢資料。分區鍵選擇的是否合适直接決定了分區後資料庫的性能,對于分區鍵的選擇,我們應該做到以下幾點:

分區鍵要能盡量避免跨分片查詢的發生;

分區鍵要能盡量使各個分片中的資料平均。

(1)如何存儲無需分片的表?

方案一:每個分片中存儲一份相同(備援)的資料。這種方式可以更好的提高查詢效率。如果使用這種方式,對于維護每個分片中相同表的一緻性就顯得非常重要了,一般可以采用多寫的方式維護資料;

方案二:使用額外的節點統一存儲。好處是不存在資料備援問題。如果分片的表與統一存儲的表需要關聯查詢時,就隻能由程式分别查詢後進行合并操作了,查詢效率比方案一要差一些。

(2)如何在節點上部署分片?

方案一:每個分片使用單一資料庫,并且資料庫名也相同;

方案二:将多個分片表存儲在一個資料庫中, 由于資料的表不能重名,是以需要在表名上加入分片号字尾;

方案三:在一個節點中部署多個資料庫,每個資料庫包含一個分片。

(3)如何配置設定分片中的資料?

方案一:按分區鍵的 Hash 值取模來配置設定分片資料。優點是可以相對平均的,在各個分片中配置設定資料,缺點是很難人為的控制什麼樣的資料配置設定到哪個分片中;

方案二:按分區鍵的範圍來配置設定分片資料。常用于分區鍵是日期類型或數值類型的情況,優點是可以很清楚的知道某條資料配置設定到了哪個分片中,缺點是很容易産生資料配置設定不平均和資料通路量不平均的情況;

方案三:利用分區鍵和分片的映射表來配置設定分片資料,這張映射表需要使用緩存的方式進行緩存,否則這張映射表就可能會成為系統的瓶頸。

(4)如何生成全局唯一ID?

方案一:使用 auto_increment_increment 和 auto_increment_offset 參數;

方案二:使用全局節點來生成ID;

方案三:使用 Redis 等緩存伺服器中建立全局 ID。