sql优化--》分区--》分表--》垂直分库--》水平分库--》读写分离
分区
关于分区的博客推荐这个:https://blog.****.net/youzhouliu/article/details/52757043
1查看是否支持分区?一般现在的mysql版本都支持。
进入到mysql命令行。mysql -u root -p show plugins //查看是否支持分区,最后会出现一个 partition 这个行 表示支持
也可以 show variables like '%partition%';
2查看这个数据库所有的表的状态,是否是分区表
show table status
3查看表具有哪几个分区、分区的方法、分区中数据的记录数等信息
select
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
from information_schema.partitions where
table_schema = schema()
and table_name='test'; select schema() //查看在那个数据库
p0 id 6 1
p1 id 11 0
p2 id 16 1
p3 id MAXVALUE 1
4显示扫描哪些分区,及他们是如何使用的
explain partitions select语句
5 如何分区
注意:必须创建表是的时候才能创建分区,不能在已有的数据上对表进行分区,如果想在已有的表中创建分区,解决办法是创建一个新的表并设置好分区,然后再进行数据转移。注意;号。
-----------------------------------创建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 MAXVALUE
); -----------------------------------创建list分区
CREATE TABLE emp (
empno VARCHAR (20) NOT NULL,
empname VARCHAR (20),
deptno INT,
birthdate date NOT NULL,
salary INT
) PARTITION BY list (deptno)(
PARTITION p1 VALUES IN (10),
PARTITION p2 VALUES IN (20),
PARTITION p3 VALUES IN (30)
);
以部门作为分区依据,每个部门做一分区。 -----------------------------------创建HASH分区
CREATE TABLE emp2 (
empno VARCHAR (20),
empname VARCHAR (20),
deptno INT,
birthdate date ,
salary INT
) PARTITION BY HASH (deptno) PARTITIONS 3; -----------------------------------创建key分区
CREATE TABLE emp (
empno VARCHAR (20) NOT NULL,
empname VARCHAR (20),
deptno INT,
birthdate date NOT NULL,
salary INT
) PARTITION BY KEY (birthdate) PARTITIONS 4;
垂直拆分
将系统中不存在关联关系或者需要join的表可以放在不同的数据库不同的服务器中。
按照业务垂直划分。比如:可以按照业务分为资金、会员、订单三个数据库。
需要解决的问题:跨数据库的事务、join查询等问题。
水平拆分
例如,大部分的站点。数据都是和用户有关,那么可以根据用户,将数据按照用户水平拆分。
按照规则划分,一般水平分库是在垂直分库之后的。比如每天处理的订单数量是海量的,可以按照一定的规则水平划分。需要解决的问题:数据路由、组装。
推荐几篇博客,讲的很不错:
https://www.cnblogs.com/jpfss/p/9176150.html#undefined
https://www.cnblogs.com/bluebluesky/articles/6413255.html