当数据库性能出现瓶颈时就需要通过扩展来提升性能,对于扩展性来说要么加强机器本身的性能,要么把任务分发到不同的机器上。对于数据库来说通过强悍的机器解决成本是很大的,如Oracle。通过多个廉价的机器实现水平扩展是现代的主流解决方案,如Mysql。
数据库水平扩展的核心是把数据拆分成不同的单元并放在不同的独立的实例上,这样就做到了负载均衡。拆分分为逻辑和物理拆分,逻辑拆分是对物理上不可分割的实例进行逻辑上的分割,物理拆分是拆分成多个独立的实例:
-
逻辑拆分
-
分区(Partition)
-
分表
-
-
物理拆分
-
读写分离
-
垂直拆分(分库)
-
水平拆分(分表)
-
1.逻辑拆分
1.1 分区
我理解的逻辑分区:举个例子,操作系统中的分区,是将硬盘根据大小进行逻辑分区,就是我们看到的C、D、E、F盘,逻辑分区还是在同一个操作系统中。数据库产品的Partition分区也是一样的道理,将数据进行逻辑分区,对数据划分界限。
MySql 支持Range,List,Hash,Key。最常用的是Range。注意不同的版本对分区类型的支持有些不同!
Range:范围
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)
);
LIST:列表
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)