分区
当数据量过大的时候(通常是指百万级别或千万级别数据的时候),这个时候需要将一张表的数据划分几张表存储,一些查询可以得到极大的优化,这主要借助于满足一个给定WHERE语句的数据可以只保存一个或多个分区内,这样查询时就不用查找其他剩余的分区,好比一本书太厚了,我们写三本书。
利用范围分区
以MyIsam引擎举例
create table topic (
`tid` int primary key auto_increment,
`title` char(20) not null default '',
)engine myisam charset utf8
partition by range(tid) (
partition t0 less than(10),
partition t1 less than(20),
partition t2 less than(MAXVALUE)
);
复制代码
一般的表有三个文件
- news.frm 表结构
- news.MYD 表数据
- news.MYI 表索引
此时topic表
- topic.frm
- topic.par
- topic#P#t0.MYD
- topic#P#t0.MYI
- topic#P#t1.MYD
- topic#P#t1.MYI
- topic#P#t2.MYD
- topic#P#t2.MYI
利用散列点来分区
create table area (
`aid` int,
`zone` char(6)
)engine myisam charset utf8;
复制代码
insert into area values (1,'bj'),(2,'hb'),(3,'sx'),(4,'ah');
复制代码
create table user (
uid int,
uname char(6),
aid int
)engine mysiam charset utf8
partition by list(aid) (
partition bj values in (1),
partition hb values in (2),
partition xs values in (3),
partition an values in (4)
);
复制代码
- user.frm
- user.par
- user#P#ah.MYD
- user#P#ah.MYI
- user#P#bj.MYD
- user#P#bj.MYI
- user#P#hb.MYD
- user#P#hb.MYI
- user#P#sx.MYD
- user#P#sx.MYI
insert into user(uname,aid) values ('poly1', 1);
insert into user(uname,aid) values ('poly2', 2);
insert into user(uname,aid) values ('poly3', 3);
insert into user(uname,aid) values ('poly4', 4);
复制代码
分库分表
为什么要分库分表
- 数据库瓶颈
- 连接数
- 处理能力
- 存储容量
数据库优化方案
- SQL优化
- 索引
- 分区
- 连接池 druid
- 缓存 redis
- 读写分离 主从和集群
- 集群:负载均衡--容错性和高性能(同步数据)
- 主从:数据冗余--高可用(异步)
- 分库分表
- 扩展硬件
- 大数据 搜索引擎
什么时候考虑切分
- 能不切分尽量不要切分
- 阿里巴巴规约:单表行数超过500万行或者单表容量超过2G,才推荐分库分表,如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表
SELECT
table_name,
(data_length/1024/1024) AS data_mb,
(index_length/1024/1024) AS index_mb,
((data_length + index_mb)/1024/1024) AS all_mb
FROM
information_schema.tables
WHERE
table_name = 'bus_customer_info';
复制代码
切分的类型和特点
- 垂直分库
- 垂直分表
- 水平分表
- 水平分库分表
切分以后的问题
- 事务一致性的问题 ACID XA规范 事务补偿(财务对账)
- 跨节点的关联查询问题 join
- 全局表(不切分)
- 字段冗余
- ER 关系和实体 父表(订单表order_id) 子表(order_id订单明细)
- catle注解 Sharejoin
- 跨结点的分页、排序、函数(count sum)
- 全局主键--雪花算法snow flaske 分布式ID
- 数据迁移和扩容(存储数据和增量数据)
单体应用架构的问题:
-
版本1
- 数据库压力大(连接数的问题)
- 模块之间的交互 耦合度是不是太高了
- 逻辑复用的问题
-
版本2
- 业务拆分的问题
- 单表的数据量的问题没有解决
-
分库的过程
-
水平划分是解决性能问题的集群方案
- 拆分规则的选择
-
垂直划分是解决模块之间耦合的问题
- 括库JOIN、分布式事务
-
分区和分库分表的差异
个人认为分区还是在一个服务器上,而分库分表在多个服务器上,两台相同配置的服务器连接数肯定比一台要多,但是分区插入式不需要你自己判断插到哪个区,而分库分表不借助中间件的话自己需要判断,工作中订单表是按着年做的分表,但是在同一台服务器上,这个统计一个用户的全部订单的时候就需要把多张订单表全部统计了,优化方案就是把历史订单数据放到redis