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. Java多线程_缓存对齐

    1.什么是缓存对齐 当前的电脑中,数据存储在磁盘上,可以断电保存,但是读取效率较低.不断电的情况下,数据可以在内存中存储,相对硬盘效率差不多是磁盘的一万倍左右.但是运算时,速度最快的是直接缓存在CPU ...

  2. Mybatis 循环删除/插入

    <foreach collection="array" open="(" separator="," close=")&qu ...

  3. utf-8变长

    utf-8变长 变长规则 一字节:0******* 两字节:110,10* 三字节:1110,10,10**** 四字节:11110**,10******,10,10* 如果是以0开头的,那么他就是一 ...

  4. Jmeter 常用函数(11)- 详解 __TestPlanName

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 返回测试计划名称 语法格式 ${__T ...

  5. 算法-deque双端队列

    Python的deque模块,它是collections库的一部分.deque实现了双端队列,意味着你可以从队列的两端加入和删除元素 1.基本介绍 # 实例化一个deque对象d = deque()d ...

  6. pandas 数据表中的字符与日期数据的处理

    前面我们有学习过有关字符串的处理和正在表达式,但那都是基于单个字符串或字符串列表的操作.下面将学习如何基于数据框操作字符型变量. 同时介绍一下如何从日期型变量中取出年份,月份,星期几等,如何计算两个日 ...

  7. HTML5移动开发之路(1)——jqMobi中Side Menu实现(类似人人网)

    记得以前在做Native App的时候类似于人人网侧边滑动的效果非常的热,很多app仿照该效果进行开发,在jqMobi中也有类似的效果被称为Side Menu.下面我们来一步一步实现该效果. 首先新建 ...

  8. Docker学习笔记-Dockerfile文件详解

    什么是Dockerfile? Docker中有个非常重要的概念叫做--镜像(Image).Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资源.配置等文件外,还包含了一些为运 ...

  9. Nuxt.js 踩坑记录,(1)引入fs包报错

    今天又是码农的一天. 但是写着写着,不知道为啥就页面就报错了, 如图所示,我在db/app.js下引入了fs这个模块,提示我npm install,我也照做了,但是仍然报错. 通过各种百度,踩坑,最终 ...

  10. java面向对象(封装,继承,多态,抽象,接口的定义和实现)

    1.封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定 ...