緣起:有個朋友問我分區表在58的應用,我回答不出來,在我印象中,百度、58都沒有聽說有分區表相關的應用,業內進行一些技術交流的時候也更多的是自己分庫分表,而不是使用分區表。於是去網上查了一下,並詢問了58到家的DBA專家,將自己收到的信息沉澱下來,share給大伙。 解決什麼問題? 回答:當mysq ...
緣起:有個朋友問我分區表在58的應用,我回答不出來,在我印象中,百度、58都沒有聽說有分區表相關的應用,業內進行一些技術交流的時候也更多的是自己分庫分表,而不是使用分區表。於是去網上查了一下,並詢問了58到家的DBA專家,將自己收到的信息沉澱下來,share給大伙。
解決什麼問題?
回答:當mysql單表的資料庫過大時,資料庫的訪問速度會下降,“數據量大”問題的常見解決方案是“水平切分”。
mysql常見的水平切分方式有哪些?
回答:分庫分表,分區表
什麼是mysql的分庫分表?
回答:把一個很大的庫(表)的數據分到幾個庫(表)中,每個庫(表)的結構都相同,但他們可能分佈在不同的mysql實例,甚至不同的物理機器上,以達到降低單庫(表)數據量,提高訪問性能的目的。
分庫分表往往是業務層實施的,分庫分表後,為了滿足某些特定業務功能,往往需要rd修改代碼。
什麼是mysql的分區表?
回答:所有數據還在一個表中,但物理存儲根據一定的規則放在不同的文件中。這個是mysql支持的功能,業務rd代碼無需改動。
看上去分區表很帥氣,為什麼大部分互聯網還是更多的選擇自己分庫分表來水平擴展咧?
回答:
1)分區表,分區鍵設計不太靈活,如果不走分區鍵,很容易出現全表鎖
2)一旦數據量併發量上來,如果在分區表實施關聯,就是一個災難
3)自己分庫分表,自己掌控業務場景與訪問模式,可控。分區表,研發寫了一個sql,都不確定mysql是怎麼玩的,不太可控
4)運維的坑,嘿嘿
5)…
文章很短,一分鐘搞定,希望大家有收穫,有任何疑問歡迎提出,我不懂的再去問DBA專家。如果大家有分區表的應用,踩了什麼坑,亦可回覆,我下一篇文章share出來。
埋坑:如何來進行水平切分,分庫分表?如果大伙感興趣,後續和大家聊更多的資料庫架構。
以user(uid, name, passwd)
擴展到user(uid, name, passwd, age, sex)為例
基本原理是:
(1)先創建一個擴充欄位後的新表user_new(uid, name, passwd, age, sex)
(2)在原表user上創建三個觸發器,對原表user進行的所有insert/delete/update操作,都會對新表user_new進行相同的操作
(3)分批將原表user中的數據insert到新表user_new,直至數據遷移完成
(4)刪掉觸發器,把原表移走(預設是drop掉)
(5)把新表user_new重命名(rename)成原表user
擴充欄位完成。
優點:整個過程不需要鎖表,可以持續對外提供服務
操作過程中需要註意:
(1)變更過程中,最重要的是衝突的處理,一條原則,以觸發器的新數據為準,這就要求被遷移的表必須有主鍵(這個要求基本都滿足)
(2)變更過程中,寫操作需要建立觸發器,所以如果原表已經有很多觸發器,方案就不行(互聯網大數據高併發的線上業務,一般都禁止使用觸發器)
(3)觸發器的建立,會影響原表的性能,所以這個操作建議在流量低峰期進行
pt-online-schema-change是DBA必備的利器,比較成熟,在互聯網公司使用廣泛。