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. windows服务器下,mysql运行一段时间之后忽然无法连接,但是mysql服务启动正常

    出现这种情况以前都是重启服务器可以解决,但是治标不治本,一段时间之后仍然会出现此问题. 此问题不是mysql应用程序的问题而是windows server system 的配置问题.因此需要修改win ...

  2. Git的使用方法及IDEA与Git的集成

    一.Git的环境配置 1.Git软件下载 (下载地址:https://git-scm.com/)由于国外的网站下载的超慢可以使用国内的阿里的开源镜像下载(下载地址:https://npm.taobao ...

  3. 输入url后的加载过程~

    1)查找域名对应的IP地址: 2)建立连接(TCP的三次握手): 3)构建网页: 4)断开连接(TCP的四次挥手): TCP的三次握手:为了准确无误的把数据送到目标处,TCP协议采用了三次握手策略,用 ...

  4. PythonCrashCourse 第十章习题

    在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python知识,其中每一行都以"In Python you can"打头.将这个文件命名为 learning_pytho ...

  5. 转行做程序员,培训or自学?过来人亲身经历良心分享

    大家好,我是良许. 熟悉我的朋友应该知道我是学机械出身的,但是毕业后就自学转行成了一名 Linux 应用开发工程师了.我之前也做了几个跟转行相关的视频,有兴趣的小伙伴可以去看看. 在本文里,我将给大家 ...

  6. Linux 查网关和dns命令

    一,查看网关(缺省路由)方法: 1.route -n 或netstat -rn2.ip route show  二, 查看DNS: nslookup www.baidu.com

  7. 直播报名 | 8.29 Kylin Meetup – 来聊聊云原生

    云原生的巨浪正在席卷全球的软件产业,包括开源和商业软件.Apache Kylin 正在为此而积极准备着:基于新的计算和存储引擎,即将发布的 Kylin 4.0 将实现真正的计算和存储分离,减小运维难度 ...

  8. golang方法

    1.方法声明 在函数声明时,在其名字之前放上一个变量,即是一个方法.这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法. package main import &quo ...

  9. linux 基本命令整理--转

      推荐:http://www.cnblogs.com/lingiu/p/3446647.html 1. 查看目录文件:ls2. 查看目前路径:psw3. 查看文件内容:cat 文件名4. 打开编辑器 ...

  10. 团队作业3 需求改进&系统设计(银河超级无敌舰队)

    目录 一.需求&原型改进 1. 需求改进 2. 修改说明书 3.功能分析 4. 调整WBS及计划 二.系统设计 1. 总体设计 2. 数据库设计 3.社团设计 三.Alpha任务分配计划 1. ...