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. python3 - selenium 添加有账号密码的代理

    from selenium import webdriver import string import zipfile # 打包Google代理插件 def create_proxyauth_exte ...

  2. 实体类转xml

    看项目中需要实体类转xml,大家是拼接的.感觉可以利用反射实现.于是写了下 代码如下 package com.kevin.util; import org.springframework.util.O ...

  3. Python实现电脑控制,这个库让你可以控制和监控输入设备

    前言 这个库让你可以控制和监控输入设备.对于每一种输入设备,它包含一个子包来控制和监控该种输入设备:pynput.mouse:包含控制和监控鼠标或者触摸板的类.pynput.keyboard:包含控制 ...

  4. 笔记:html基础

    一.HTML:超文本标记语言,是一种标签语言,不是编程语言,显示数据有双标签<body></body> 和单标签<img src=# / >, 标签大小写都可以 通 ...

  5. SpringMVC关于拦截器的使用

    这个是基于之前的视图定位进行的. @ 目录 拦截器类:IndexInterceptor 配置拦截器 修改 index.jsp 效果 拦截器类:IndexInterceptor package inte ...

  6. IntelliJ IDEA安装Activiti插件并使用

    一.安装Activiti插件 1.搜索插件 点击菜单[File]-->[Settings...]打开[Settings]窗口. 点击左侧[Plugins]按钮,在右侧输出"actiBPM",点击 ...

  7. adb修改手机分辨率

    一.手机分辨率对照表 宽×高(标准值) 240×320 320×480 480×800 720×1280 1080×1920 1440×2560 DPI等级 LDPI MDPI HDPI XHDPI ...

  8. Linux环境下没有权限操作文件或目录

    linux下有超级用户(root)和普通用户,普通用户不能直接操作没有权限的目录,如果出现了没有权限的提示,可以尝试用su命令解决. 比如: #mkdir aaa 我要创建一个aaa的文件夹,没有操作 ...

  9. 第五篇 Scrum冲刺博客

    一.会议图片 二.项目进展 成员 完成情况 今日任务 冯荣新 未完成 购物车列表,购物车工具栏 陈泽佳 未完成 静态结构 徐伟浩 商品信息录入 协助前端获取数据 谢佳余 未完成 搜索算法设计 邓帆涛 ...

  10. 第四篇 Scrum冲刺博客

    一.会议图片 二.项目进展 成员 完成情况 今日任务 冯荣新 商品底部工具栏 购物车列表 陈泽佳 渲染搜索结果,防抖的实现 静态结构 徐伟浩 未完成 商品信息录入 谢佳余 未完成 搜索算法设计 邓帆涛 ...