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. Vue中keep-alive组件的理解

    对keep-alive组件的理解 当在组件之间切换的时候,有时会想保持这些组件的状态,以避免反复重渲染导致的性能等问题,使用<keep-alive>包裹动态组件时,会缓存不活动的组件实例, ...

  2. 10款人气暴涨的PHP开源工具

    若想创建动态而又新颖的Web应用程序,PHP便是理想的选择.不用说,在Web开发世界里,PHP是最流行的语言之一.一些非常好用的PHP开源工具着实拯救了不少开发任务繁重的PHP开发人员,减轻他们的开发 ...

  3. Java多线程_阻塞队列

    1.什么是阻塞队列       我们知道,PriorityQueue.LinkedList这些都是非阻塞队列.在我们使用非阻塞队列的时候有一个很大问题,它不会对当前线程产生阻塞,那么在面对类似消费者- ...

  4. asp.net报表结构学习记录

    当一份web报表项目压缩包躺在我的文件夹里时,我是完全懵的.作为一个学习了一个月java的asp.net小白,以前从来没有接触过这方面,我完全不知道从何入手. 手里也有asp.net开发学习视频,但都 ...

  5. IDEA下Maven项目搭建踩坑记----1.pom,xml文件下${spring-version}不能用

    因为pom.xml文件是直接复制别人配好的web环境,所以在粘贴进去的之后有一部分没有粘贴到,因此出现爆红 解决方法:↓↓↓↓ 代码: <project.build.sourceEncoding ...

  6. 安装yarn 心得分享

    初次使用yarn ,坑的我,全局安装完@vue/cli,安装之后就是说vue不是内部命令,研究好久,总结一下分享大家一起学习 1,首先安装yarn: 安装yarn 去官网下载yarn 安装包 默认安装 ...

  7. python+opencv 打开网络摄像头

    python+opencv 打开网络摄像头(手机)(转) #以下是最常用的读取视频流的方法import cv2url = 'rtsp://admin:admin@192.169.5.2:554/'#根 ...

  8. 重温Java Web的技术细节

    目录 一.背景 二.请求与响应 2.1.Http请求 2.2.Http响应 三.ServletConfig 3.1 测试ServletConfig参数 四.ServletContext 4.1 测试S ...

  9. java开发,入职半年,对未来迷茫,如何发展?

    分享-更多精彩图片尽在大师助手 个人建议,在JAVA方面,先学好JAVA SE.不管如何,基础才是上层建筑的一切.推荐去看jdk源码,推荐1.6或者1.7版本.因为1.8版本的源码中会有很多lambd ...

  10. JS - 有趣的面试题

    for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000); } //这个例子执行完输出什么结果 ...