sql优化--》分区--》分表--》垂直分库--》水平分库--》读写分离
分区
关于分区的博客推荐这个:https://blog.csdn.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