支付之订单表的垂直切分和水平切分

"表的切分有3个问题:1.切分的对象是谁?表; 2.怎么切分?垂直(按表的字段)和水平(按表的数据记录行); 3.谁来实现切分功能?数据库厂商或应用程序 "

Posted by 青乡 on January 1, 2016

数据量

单表-订单表
几十万/日
几千万/年
几亿/累计

数据大小

G

注:达到G,oracle官方推荐分区。

带来的问题

单表过百万,速度就很慢。

如何解决查询慢的问题

1.近期数据
近几个月的数据,放到订单库的订单表。

2.历史数据
放到历史库。

历史库

数据还是过亿。怎么处理?分区。

分区

oracle

怎么分区?

创建表的同时,创建分区。

创建分区,有好几种不同方式?
1.range //最常用,也最简单
按某个字段,比如按订单id字段的值划分://订单id是内部使用id,按一定规则数字增长 //什么规则?不是从1开始,因为这样会泄露订单数量,而是从一个其他的数字开始增长

1)1~50万 //这是一个分区
2)50万~100万 //这是一个分区
… //n个分区

总共划分为几十个分区。//几十万/日,1 2个月几百万上千万,分为几十个分区

2.list
相当于是枚举enum,就是有几个固定的值。

https://blog.csdn.net/clark_xu/article/details/44749045

https://my.oschina.net/u/140722/blog/30232

3.hash
字段——》hash——》随机选择一个分区,插入数据。

http://m635674608.iteye.com/blog/2248918 https://blog.csdn.net/weixin_36707770/article/details/54086901

怎么访问?

1.range
1)插入
会根据字段的值,自动插入到对应的分区。这个是数据库厂商实现和支持的。不需要程序去处理分区的问题,当然如果在程序里处理也可以。
2)查找
同上。

3)查找-跨分区/多分区 一、 默认自动查找多个分区。 二、 如果实在要手动指定也可以。
代码计算属于哪个分区 + sql指定分区。//具体怎么计算?怎么指定?代码和sql?1.select * from partition(分区表名字1), partition(分区表名字2) where …; 2.分2次查,合并结果(union)。

2.list

3.hash

水平切分

什么意思?
水平是指按表的数据记录行,水平切分。

就是把表看成一行行的记录,如果行达到百万级别,那么就需要水平把记录切分到多个表里去。

所谓水平切分就是把表的数据,划分到多个表。

切分对象是谁?表里的数据记录行。
谁来切分?1.数据库厂商 2.应用程序


谁来切分,有2种解决方案?
1.数据库厂商支持表分区partition
这就是数据库厂商支持表的水平切分。

一切都是自动的,1.创建表同时,以某个字段创建分区 2.自动根据字段值的大小,插入对应分区 3.查找的时候也是自动根据字段的值大小,选择对应的分区。

2.应用程序
这个时候不是分区,因为分区是数据库厂商实现的功能这么一个概念。
现在是多张表,比如order现在是order1、order2、order3。
1)插入
手动判断插入哪一张表。
2)访问
手动判断查找哪一张表。

总而言之,有2个不同,1.一个是分区,一个是多个表 2.sql是否需要手动判断插入哪一个表。

垂直切分

垂直指什么?
按表的字段切分,叫垂直切分。


应用场景?
如果一张表包含了大几十个字段,而且有的字段是大数据,那么就应该把一部分附加信息字段拆分出来,独立为一张单独的表,比如,订单表(重要字段)和订单附加信息表(非重要字段和大数据字段)。

参考

https://blog.csdn.net/xieyuooo/article/details/5437126

https://www.oracle.com/technetwork/cn/articles/sql/11g-partitioning-089831-zhs.html

https://blog.csdn.net/shiyong1949/article/details/59586773

https://zhuanlan.zhihu.com/p/24036067?utm_source=wechat_session&utm_medium=social https://blog.csdn.net/xlgen157387/article/details/53976153 http://redhat.iteye.com/blog/1379208