1为什么需要数据分片技术

数据库产品的市场
在互联网行业内,绝大部分开发人员都会遇到数据表的性能问题,特别是当单表数据量特别大的时候,就算是添加索引,性能也都差强人意。对于亿级别的数据,有些大的企业会选择性能非常好的Oracle,Oracle属于中大型数据库,能在数据量大的情况下有好的数据处理性能。但是绝大部分小型企业是不会选择昂贵的oracle的,况且几乎所有的互联网巨头公司选择的也都是免费开源的Mysql数据库。

蚂蚁金服自主研发的金融级分布式关系数据库OceanBase前一阵子打破了Oracle保持了9年的记录,刷新了国际数据库知名排行榜的最高记录。因此对于未来数据库产品市场的变化,我相信国内的厂商是能够开辟出数据库市场份额的。

mysql小型数据库瓶颈
互联网行业企业都倾向于mysql数据库,虽说mysql单表能支持亿级别的数据量,加上索引优化下查询速度,勉强能使用,但是对于追求性能和效率的互联网企业,这是远远不够的。Mysql数据库单表数据量到达500万左右,达到性能最佳点,可是对于需要亿级别的业务来说,500万是远远不够的。既然数据放在一个位置不行,那我们就把数据拆分放到多个位置。如果寻找数据位置的时间成本忽略不计的话,那么在亿级别的数据量里面查询数据的时间成本就相当于从单张表力查询数据的时间成本一样。这就是分库分表的最初思想。

2. 四种数据分区方式简述 (笔者这里只探讨水平分区)

对表进行分区,是为了能最大限度的提高数据库的IO能力,分区能让数据库将同一张表中的数据放在不同的磁盘下,提高数据库IO能力,类似多核多线程的思想。因此分区能提高单标的高并发能力。

range分区
range方式创建分区语句如下:

#根据表结构中的时间字段来作为分区键,如下的year()方法,或者to_char()方法
create table table_range(
   id int(11),
   amt int(11) unsigned not null,
   created_on datetime
  )partition by range(year(created_on))(
  partition p2018 values less than (2018),
  partition p2019 values less than (2019),
  partition p2020 values less than (2020)
  partition pdefault values less than maxvalue #MAXVALUE 表示最大的可能的整数值
  );
#或者使用id作为范围分区
create table table_range(
   id int(11),
   amt int(11) unsigned not null,
   created_on datetime
  )partition by range(id)(
  partition p10000 values less than (10000),
  partition p20000 values less than (20000),
  partition p30000 values less than (30000)
  partition pdefault values less than maxvalue #MAXVALUE 表示最大的可能的整数值
  );

范围分区

  • 所有范围区间不能重叠。
  • 查询条件里包括分区键,免全表扫描,分区表查询都应该注意这个。
  • 分区键一般是时间或是唯一的索引值,一般都会在每条数据上计算并保存分区字段。

list分区

create table table_list(
  id int(11),
  type int(4)
  )(partition by list (type)
  partition p0 values in (1,3,5,7,9),
  partition p1 values in (2,4,6,8,0)
);
  • 分区键的值是个有限的枚举值集合,分区字段值都要在枚举列表里找到。
  • list分区可用在对业务类型进行分割切分。

hash分区

CREATE TABLE table_hash(
id INT NOT NULL,
name VARCHAR(30),
id_card INT
)
PARTITION BY HASH(id_card)
PARTITIONS 4;
  • hash分区可以自定义hash算法
  • 分区数量要符合2的n次方倍数,扩容的时候就不会发生大规模数据的迁移
  • hash值只能是整数类型字段或者整数表达式

key
key分区类似hash分区,只不过key分区不能自定义hash规则,只能使用mysql的方法。

CREATE TABLE table_key (
id INT NOT NULL,
name CHAR(5),
date DATE
)
PARTITION BY LINEAR KEY (id)
PARTITIONS 3;
  • key分区键除了blob和txt类型字段不能使用之外,其他类型都能作为分区键。
  • key分区是mysql自带的一种分区方式

3. 分片技术原理概述

分区,这两个字的关键在于分这个字,即分而治之的思想。

分而治之,体现在软件设计的各个方面:

应用层服务:采用载均衡服务器+服务集群的方式,拆分系统访问流量,均分请求的响应和处理压力。

服务层:采用分布式架构,利用分布式框架,注册中心+客户端负载均衡机制,耦合各个服务的依赖关系。采用消息队列,耦合并拆分复杂的业务流程。

数据层:一个数据库部署在一台服务器上,数据库的性能就会被服务器资源所限制,那么我们就需要拆分数据库的读写请求流量,这时候分库的方法就是我们所需要的解决方案。

总而言之,言而总之;数据分片技术的核心思想就是拆分流量,拆分压力。

那么对于分区而言,它拆分的是磁盘IO的压力,我们要有个基本的认识,每台服务器的磁盘存储是由很多歌磁盘组成的磁盘阵列构成,每个磁盘的IO能力是有上限的,而mysql单表数据是放在一个文件内的,因此单表的所有读写压力都会聚集到一个磁盘。但是分区表会将分区放在不同的磁盘上,那么对单表的读写压力就会拆分到多个磁盘上。

因此,分区就是拆分磁盘IO压力。

4. 对单表分区的时机

  • 表数据大,且增量数据也多,业务只会访问靠后的热点数据,例如即时通讯聊天记录数据。

  • 单表查询速度慢,需要优化查询速度。

  • 经常维护数据,定期删除历史数据,可以通过分区的方式来实现。

  • 因单表情况下数据IO集中在少量的设备上,需要均衡IO,把数据访问压力平均据分配到各个硬件设备,改善系统性能。

Mysql数据分片技术(一)——初识表分区的更多相关文章

  1. MySQL数据库分片技术调研

    将这段时间了解的MySQL分片技术和主从复制只是整理清楚画了思维导图记录一下,希望能给需要的人一些帮助 P.S.:个人整理,可能会有错误之处,还望指出~ 要解决的问题 1.海量数据的操作超出单表.单库 ...

  2. Zabbix的history相关数据表数据太大,执行表分区操作过程

    一.查询zabbix数据库大小 mysql> select table_schema, concat(truncate(sum(data_length)/1024/1024,2),' mb') ...

  3. Logstash学习之路(四)使用Logstash将mysql数据导入elasticsearch(单表同步、多表同步、全量同步、增量同步)

    一.使用Logstash将mysql数据导入elasticsearch 1.在mysql中准备数据: mysql> show tables; +----------------+ | Table ...

  4. WebGIS项目中利用mysql控制点库进行千万条数据坐标转换时的分表分区优化方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目中有1000万条历史案卷,为某地方坐标系数据,我们的真实 ...

  5. MySQL数据库优化技术之数据库表的设计

    三范式介绍表的范式:只有符合的第一范式,才能满足第二范式,进一步才能满足第三范式. 1. 第一范式:表的列具有原子性,不可再分解.只要是关系型数据库都自动满足第一范式.数据库的分类:关系型数据库:My ...

  6. 以 280W 数据为依据。对比SQL2008 表分区前和分区后的 T_SQL 效率

    一: 数据库的优化一直项目后期的重中之重,特别是当单表数据庞大到1000W时候.各种SQL语句执行效率都会慢很多.SQL 效率 与索引,行数据,列数据,以及Where 刷选字段类型 (效率 整数型大于 ...

  7. Kettle ETL 来进行mysql 数据同步——试验环境搭建(表中无索引,无约束,无外键连接的情况)

    今天试验了如何在Kettle的图形界面(Spoon)下面来整合来mysql 数据库中位于不同数据库中的数据表中的数据. 试验用的数据表是customers: 第三方的数据集下载地址是:http://w ...

  8. mysql数据类型和java对应表(copy)

    [说明] 资料来自:http://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-type-conversions.html My ...

  9. MongoDB入门三步曲3--部署技术:主备、副本集和数据分片

    mongodb部署--主备.副本及数据分片 主备复制 副本集 数据分片 主备复制 主备复制是最基本的一种多点部署方案,在读写分离.热备份.数据恢复等方面具有重要作用. 在真实的生产环境,主备库肯定需要 ...

随机推荐

  1. js、jQuery、ajax面试题

    1.javascript的typeof返回哪些数据类型. 答案:string,boolean,number,undefined,function,object 2.例举3种强制类型转换和2种隐式类型转 ...

  2. 编译Uboot时出错:【已解决】 /bin/bash: arm-linux-gcc: command not found dirname: missing operand Try 'dirname --help' for more information.

    编译Uboot时出错: 错误信息如下: /bin/bash: arm-linux-gcc: command not found dirname: missing operand Try 'dirnam ...

  3. unity探索者之socket传输protobuf字节流(一)

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/6974229.html 近期在做一个棋牌项目,需要用到socket传输protobu ...

  4. oracle replace的用法

    表数据里面有些数据是有换行或者特殊字符的,想要去掉,但是几千条记录要一条条改基本不可能. 后来想到了replace这个函数,具体用法如下: update 表1 t set t.列1=replace(( ...

  5. Linux环境下安装JDK8

    Linux环境下搭建Java项目运行环境,首先要安装JDK,安装JDK8的步骤如下: 1 下载JDK安装包 下载地址:http://www.oracle.com/technetwork/java/ja ...

  6. 计算机网络-应用层(1)Web应用与HTTP协议

    Web 页面(Web page,也叫文档)是由对象组成的. 对象:HTML文件.JPEG图片.视频文件.动态脚本等,通过一个URL地址寻址.每个URL地址由存放对象的服务器主机名和对象的路径名组成. ...

  7. SCAFFOLD: Stochastic Controlled Averaging for On-Device Federated Learning

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 以下是对本文关键部分的摘抄翻译,详情请参见原文. arXiv:1910.06378v1 [cs.LG] 14 Oct 2019 Abstr ...

  8. webgl实现径向模糊

    径向模糊简介 径向模糊,是一种从中心向外呈幅射状,逐渐模糊的效果. 因此径向模糊经常会产生一些中心的发散效果,在PS中同样也有径向模糊的滤镜效果. 径向模糊通常也称为变焦模糊.径向模糊(Radial ...

  9. IntelliJ IDEA下git版本回退,版本还原

    原文链接:https://blog.csdn.net/hehyyoulan/article/details/80005272

  10. C# 接口的Get、Post、WebService请求方法一览,值得收藏

    C# 接口的Get.Post.WebService请求方法一览,值得收藏 public static class HttpHelper { const string DEFAULT_USER_AGEN ...