由mysql分区想到的分表分库的方案
在分區(qū)分庫(kù)分表前一定要了解分區(qū)分庫(kù)分表的動(dòng)機(jī)。
對(duì)實(shí)時(shí)性要求比較高的場(chǎng)景,使用數(shù)據(jù)庫(kù)的分區(qū)分表分庫(kù)。
對(duì)實(shí)時(shí)性要求不高的場(chǎng)景,可以考慮使用索引庫(kù)(es/solr)或者大數(shù)據(jù)hadoop平臺(tái)來(lái)解決(如數(shù)據(jù)分析,挖掘,報(bào)表等)或者混合使用(如es+hbase/mongodb)。
...分區(qū)解決冷熱數(shù)據(jù)分離的問(wèn)題;
...分庫(kù)解決互聯(lián)網(wǎng)的高并發(fā)問(wèn)題;
...分表解決互聯(lián)網(wǎng)的高容量問(wèn)題;
...分庫(kù)分表解決高并發(fā)和高容量的問(wèn)題。
今天細(xì)細(xì)品味了一下mysql分區(qū)的官方資料,有一點(diǎn)點(diǎn)收獲,記錄下來(lái)。
1.mysql的分區(qū)
官方文檔介紹的比較詳細(xì),這里就以實(shí)例為主介紹。
1.1 分區(qū)類型
? ? 1.range分區(qū)
CREATE TABLE employees (id INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30),hired DATE NOT NULL DEFAULT '1970-01-01',separated DATE NOT NULL DEFAULT '9999-12-31',job_code INT NOT NULL,store_id INT NOT NULL ) PARTITION BY RANGE (store_id) (PARTITION p0 VALUES LESS THAN (6),PARTITION p1 VALUES LESS THAN (11),PARTITION p2 VALUES LESS THAN (16),PARTITION p3 VALUES LESS THAN (21) );2.list分區(qū)
CREATE TABLE employees (id INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30),hired DATE NOT NULL DEFAULT '1970-01-01',separated DATE NOT NULL DEFAULT '9999-12-31',job_code INT,store_id INT ) PARTITION BY LIST(store_id) (PARTITION pNorth VALUES IN (3,5,6,9,17),PARTITION pEast VALUES IN (1,2,10,11,19,20),PARTITION pWest VALUES IN (4,12,13,14,18),PARTITION pCentral VALUES IN (7,8,15,16) );3.多列分區(qū)
多列分區(qū)有分為range分區(qū)和list分區(qū)
? ? ? 多列range分區(qū)
mysql> CREATE TABLE rcx (-> a INT,-> b INT,-> c CHAR(3),-> d INT-> )-> PARTITION BY RANGE COLUMNS(a,d,c) (-> PARTITION p0 VALUES LESS THAN (5,10,'ggg'),-> PARTITION p1 VALUES LESS THAN (10,20,'mmm'),-> PARTITION p2 VALUES LESS THAN (15,30,'sss'),-> PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)-> );多列l(wèi)ist分區(qū)
CREATE TABLE customers_1 (first_name VARCHAR(25),last_name VARCHAR(25),street_1 VARCHAR(30),street_2 VARCHAR(30),city VARCHAR(15),renewal DATE ) PARTITION BY LIST COLUMNS(city) (PARTITION pRegion_1 VALUES IN('Oskarshamn', 'H?gsby', 'M?nster?s'),PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'V?stervik'),PARTITION pRegion_3 VALUES IN('N?ssj?', 'Eksj?', 'Vetlanda'),PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'V?xjo')? ? ? ?4.Linear hash分區(qū)
CREATE TABLE employees (id INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30),hired DATE NOT NULL DEFAULT '1970-01-01',separated DATE NOT NULL DEFAULT '9999-12-31',job_code INT,store_id INT ) PARTITION BY LINEAR HASH( YEAR(hired) ) PARTITIONS 4;5. Key分區(qū)
CREATE TABLE tm1 (s1 CHAR(32) PRIMARY KEY ) PARTITION BY KEY(s1) PARTITIONS 10;6.Sub分區(qū)
CREATE TABLE ts (id INT, purchased DATE)PARTITION BY RANGE( YEAR(purchased) )SUBPARTITION BY HASH( TO_DAYS(purchased) )SUBPARTITIONS 2 (PARTITION p0 VALUES LESS THAN (1990),PARTITION p1 VALUES LESS THAN (2000),PARTITION p2 VALUES LESS THAN MAXVALUE);7.對(duì)控制的處理
range分區(qū),null 分到最低的分區(qū);
list分區(qū),如果包含null的列,則進(jìn)去,否則會(huì)報(bào)錯(cuò),如下實(shí)例
mysql> CREATE TABLE ts1 (-> c1 INT,-> c2 VARCHAR(20)-> )-> PARTITION BY LIST(c1) (-> PARTITION p0 VALUES IN (0, 3, 6),-> PARTITION p1 VALUES IN (1, 4, 7),-> PARTITION p2 VALUES IN (2, 5, 8)-> ); Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO ts1 VALUES (9, 'mothra'); ERROR 1504 (HY000): Table has no partition for value 9mysql> INSERT INTO ts1 VALUES (NULL, 'mothra'); ERROR 1504 (HY000): Table has no partition for value NULLhash分區(qū)和key分區(qū),null做0處理,示例如下:
mysql> INSERT INTO th VALUES (NULL, 'mothra'), (0, 'gigan'); Query OK, 1 row affected (0.00 sec)mysql> SELECT * FROM th; +------+---------+ | c1 | c2 | +------+---------+ | NULL | mothra | +------+---------+ | 0 | gigan | +------+---------+ 2 rows in set (0.01 sec)1.2 分區(qū)管理
Range和list分區(qū)管理
? ? ? ? ALTER TABLE ... DROP PARTITION 刪除分區(qū)
?ALTER TABLE ... ADD PARTITION 增加分區(qū)
ALTER TABLE ...REORGANIZE PARTITION 移動(dòng)分區(qū)
Hash和key分區(qū)管理
不能通過(guò)DROP來(lái)刪除分區(qū),可以ALTER TABLE ... COALESCE PARTITION來(lái)合并分區(qū)
?ALTER TABLE ... ADD PARTITION? 增加分區(qū)
表間的分區(qū)交換和子分區(qū)表的交換
ALTER TABLE ... EXCHANGE PARTITION
維護(hù)分區(qū)
表的維護(hù):CHECK TABLE,OPTIMIZE TABLE,ANALYZE TABLE,?REPAIR TABLE
分區(qū)的維護(hù):ALTER TABLE ...?
Rebuilding partitions
Optimizing partitions
Analyzing partitions
Repairing partitions
Checking partitions
TRUNCATE PARTITION
? ? 獲取分區(qū)信息
SHOW CREATE TABLE
SHOW TABLE STATUS
INFORMATION_SCHEMA.PARTITIONS
EXPLAIN SELECT
1.3 小結(jié)
從分區(qū)表的設(shè)計(jì)思想上來(lái)看,支持多張分區(qū)方式:range,list,多列,linear hash,key,sub分區(qū)
另外,還提供對(duì)分區(qū)的管理。
2.分庫(kù)或者分表
分區(qū),分表,分庫(kù)解決的問(wèn)題不一樣,但解決思路或者架構(gòu)設(shè)計(jì)有相通的地方,我們可以借鑒分區(qū)表的設(shè)計(jì)思維來(lái)構(gòu)建分表分庫(kù)的實(shí)現(xiàn)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
?
分區(qū)具有的功能:
分區(qū)屏蔽的對(duì)用戶dml和select的細(xì)節(jié),分表或者分庫(kù)db代理應(yīng)該也可以實(shí)現(xiàn),分表或者分庫(kù)db代理保存db的元數(shù)據(jù)和映射情況,對(duì)用戶來(lái)說(shuō),應(yīng)該屏蔽細(xì)節(jié),不應(yīng)該暴露給用戶
? ? ? ? 分區(qū)的管理提供了相應(yīng)的命令,分表或者分庫(kù)db代理也應(yīng)該實(shí)現(xiàn)該功能
? 分區(qū)不具有的功能:
? 監(jiān)控,日志,可視化等方面分區(qū)做的不夠,分表或者分庫(kù)db代理可以做的更好。
想到了hadoop的hdfs架構(gòu)設(shè)計(jì)
?
3.mycat的實(shí)現(xiàn)
根據(jù)上面的思路,是否有響應(yīng)的開(kāi)源實(shí)現(xiàn)呢?找到一個(gè)比較相近的開(kāi)源實(shí)現(xiàn)mycat:
- 一個(gè)徹底開(kāi)源的,面向企業(yè)應(yīng)用開(kāi)發(fā)的大數(shù)據(jù)庫(kù)集群
- 支持事務(wù)、ACID、可以替代MySQL的加強(qiáng)版數(shù)據(jù)庫(kù)
- 一個(gè)可以視為MySQL集群的企業(yè)級(jí)數(shù)據(jù)庫(kù),用來(lái)替代昂貴的Oracle集群
- 一個(gè)融合內(nèi)存緩存技術(shù)、NoSQL技術(shù)、HDFS大數(shù)據(jù)的新型SQL Server
- 結(jié)合傳統(tǒng)數(shù)據(jù)庫(kù)和新型分布式數(shù)據(jù)倉(cāng)庫(kù)的新一代企業(yè)級(jí)數(shù)據(jù)庫(kù)產(chǎn)品
- 一個(gè)新穎的數(shù)據(jù)庫(kù)中間件產(chǎn)品
總結(jié):
mycat在國(guó)內(nèi)使用的不少,可以試用。如果想定制自己的mycat,可以參考mysql分區(qū)的實(shí)現(xiàn)和hadoop存儲(chǔ)hdfs的架構(gòu)思想。?
參考資料:
【1】https://dev.mysql.com/doc/refman/8.0/en/partitioning-limitations-partitioning-keys-unique-keys.html
【2】http://www.mycat.io/
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/10898923.html
總結(jié)
以上是生活随笔為你收集整理的由mysql分区想到的分表分库的方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习人体姿态估计算法综述
- 下一篇: 从mysql高可用架构看高可用架构设计