layout: post title: "支付之订单表的垂直切分和水平切分" subtitle: " "表的切分有3个问题:1.切分的对象是谁?表; 2.怎么切分?垂直(按表的字段)和水平(按表的数据记录行); 3.谁来实现切分功能?数据库厂商或应用程序 "" date: 2018-10-17 06:00:00 author: "青乡" header-img: "img/post-bg-2015.jpg" catalog: true tags: - 支付 - 数据库 - database
数据量
单表-订单表
几十万/日
几千万/年
几亿/累计
数据大小
G
注:达到G,oracle官方推荐分区。
带来的问题
单表过百万,速度就很慢。
如何解决查询慢的问题
1.近期数据
近几个月的数据,放到订单库的订单表。
2.历史数据
放到历史库。
历史库
数据还是过亿。怎么处理?分区。
分区
oracle
怎么分区?
创建表的同时,创建分区。
创建分区,有好几种不同方式?
1.range //最常用,也最简单
按某个字段,比如按订单id字段的值划分://订单id是内部使用id,按一定规则数字增长 //什么规则?不是从1开始,因为这样会泄露订单数量,而是从一个其他的数字开始增长
1)1~50万 //这是一个分区
2)50万~100万 //这是一个分区
... //n个分区
总共划分为几十个分区。//几十万/日,1 2个月几百万上千万,分为几十个分区
2.list
相当于是枚举enum,就是有几个固定的值。
3.hash
字段——》hash——》随机选择一个分区,插入数据。
m635674608.iteye.com/blog/224891… blog.csdn.net/weixin_3670…
怎么访问?
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是否需要手动判断插入哪一个表。
垂直切分
垂直指什么?
按表的字段切分,叫垂直切分。
应用场景?
如果一张表包含了大几十个字段,而且有的字段是大数据,那么就应该把一部分附加信息字段拆分出来,独立为一张单独的表,比如,订单表(重要字段)和订单附加信息表(非重要字段和大数据字段)。
参考
zhuanlan.zhihu.com/p/24036067?… blog.csdn.net/xlgen157387… redhat.iteye.com/blog/137920…