分区表

主要提供例如以下的特性,或者适合如此场景:

  • 数据量非常大, 或者仅仅有表中最后的部分有热点数据。其它均为历史数据
  • 分区表数据更easy维护,能够对独立的分区删除等操作
  • 分区表的数据能够分布在不同的物理设备上。从而高效地利用多个硬件设备。
  • 能够避免一些特殊瓶颈。比方InnoDB的单个索引的相互排斥訪问
  • 能够备份和恢复独立的分区

创建分区表

通常有这么几种分法。由于主键或者是唯一约束键必须有一部分包括在分区键中,所以一般要不无主键,要不就依照自增主键的id进行范围分区,要不就把分区字段和主键一起作为联合主键。

另一些其它的限制,比方分区键的运算结果必须为整数

Range分区

CREATE TABLE biz_order(
id bigint(20) NOT NULL AUTO_INCREMENT,
created DATETIME NOT NULL COMMENT '创建时间',
PRIMARY KEY (id, created)) ENGINE=InnoDB PARTITION BY RANGE(YEAR(created))(
PARTITION p_2010 VALUES LESS THAN (2015),
PARTITION p_latest VALUES LESS THAN MAXVALUE);

这样的分区。最新的那个区显然会有最多的热点数据。 能够再使用Hash子分区来降低竞争

- 除了使用YEAR, TO_DAY等日期函数外。还能够使用其数学函数。比方取模,按7取模是周几等

List分区

是用IN来做列值匹配的集合。

比方能够依照地区来分为东西南北几个区:

PARTITION BY LIST(store_id)
PARTITION pNorth VALUES IN (3,5,6,9,17),
PARTITION pEast VALUES IN (1,2,10,11,19,20),
PARTITION pWest VALUES IN (4,12,13,14,18),
PARTITION pCentral VALUES IN (7,8,15,16)
);

这样的假设插入语句不在IN中。则会插入失败

Hash分区

PARTITIONS为分区的数量。 即会依据分区键的值计算出一个hash值,然后以4为模进行存储。优点是。不用再又一次建分区了。

PARTITION BY HASH(store_id)
PARTITIONS 4;

还有Key分区,用的太少,不说了

操作分区表

添加删除分区等语句看这里

分区表由多个底层表构成,底层表跟普通表没什么差别,其索引也是分别在各个表中的索引。 分区表仅仅是会在一个非常粗的粒度上决定一下去哪个底层表继续查询。

  • SELECT 锁住底层表。优化器先推断能够过滤部分的分期,然后再调用存储引擎接口訪问各个分区
  • INSERT DELETE同行
  • UPDATE 操作会须要设计更新后推断在哪个分区,假设插入到了新分区。那么则删除原分区中的数据。
  • 使用WHERE语句最好能够明白用到分区的关键字,这样能够非常好的命中分区
  • 锁住底层表不一定是表锁。会用到存储引擎自己的行级锁

怎样使用

使用分区表肯定是由于数据量非常大。这个时候索引已经不能非常好的起作用了。

能够不使用索引,而用粗粒度的命中分区表,然后全表扫描。

或者是针对热点数据。单独使用一个区让这个区都能够放到缓存中,这样就会有一个热点的非常小的分区,能够对其使用索引。

另外一些可能的问题:

  • NULL值。由于TO_DAY等方法NULL值为无效入參,会把值放在第一个分区,这个时候SELECT的时候可能会须要查找第一个和命中的分区这样两个分区。这样可能会有非常多的性能损耗。解决的方法是使第一个分区尽可能的小。第二个办法是直接使用RANGE COLUMNS()而不使用函数
  • 分区列和索引列应该用同一个列。假设不是,会导致无法过滤的问题
  • 寻找分区的成本可能会比較高
  • 维护分区的成本,比方alter等语句改变分区个数,或者其它涉及数据迁移的操作

分区表的查询

要在WHERE后面带分区列,且不能是表达式

使用EXPLAIN PARTITIONS SELECT来推断是否进行了分区过滤

分表

分区表还是一张表,是一种逻辑上的实现,主要解决的是单表数据过大。索引效率低的问题,非常适合大量历史数据,少量活跃数据的场景。

把数据保存在不同的区域。

分表是真的有多张表。基于分表还能够做分库,能够提升并发性能。以及磁盘I/O的性能。

二者能够配合使用。

使用集群的方式

要配合复制使用。仅仅是把查询请求进行了分摊。

可是这样不会影响代码层。

使用业务逻辑划分

可一个依据用户id来分,每一个用户一张表,这样须要每有新的用户都建表了。

还有经常使用的做法是预先设计好比方100张表,然后对数据的一个字段做hash,然后对100取模。

又或者依据时间来进行切割,这样的的优点是,假设依据时间做统计的时候能够不用UNION

上面的分表方式都不能解决依据server压力进行选择的问你,而且也不能比較均匀的保存数据。

分表之后要考虑这样几个操作以后可能会带来的问题:

  • 分页, 主要看分页情况下排序的字段是什么,假设是时间,那么依照时间段分表是比較好的, 假设会涉及到多个表的UNION,那么就会比較耗费性能。
  • 插入。 更新。 主要是更新的时候的主键的问题。由于分表之后主键不唯一了,因此须要用分表列和自增列做联合主键。
  • 分组。统计。 这个跟分页考虑的情况差点儿相同,也是主要涉及排序的问题。比方假设每次都是须要依照用户统计信息的话,那么依照用户分表的选择是没错的。
  • 表的分发跟业务非常比較大的关系。要尽量考虑比較多的因素和场景。
  • 通用一些的解决的方法是。对分页字段使用搜索引擎
  • 或者对分页和排序字段单独列一张表不分,作为查询的索引。

使用merge存储引擎

基本表:
CREATE TABLE TEST_MERGE_1(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
);
CREATE TABLE TEST_MERGE_2(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
);
MERGE表:
CREATE TABLE TEST_MERGE(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
) TYPE=MRG_MyISAM INSERT_METHOD=LAST UNION=(TEST_MERGE_1,TEST_MERGE_2);

基本表必须是MYISAM类型的。

基本表的数据结构必须一致。

order by等语句,我想的是由于Merge表里有基本表共同的索引,所以,排序的时候应该是,都先比較第一个,然后再。。。有点像经常使用的大文件分成多个小文件,然后分别排序。最后merge的过程。

主要是能够提供比較好的编码界面。

Mysql第八天 分区与分表的更多相关文章

  1. MySQL的分区、分表、集群

    1.分区 mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一 ...

  2. MySQL分区和分表

    一.概念 1.为什么要分表和分区?日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询 ...

  3. 什么是分表和分区 MySql数据库分区和分表方法

    1.为什么要分表和分区 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性 ...

  4. Mysql性能优化四:分库,分区,分表,你们如何做?

    分库分区分表概念 分区 就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的 分表 就是把一张数据量很大的表按一定的规则分解成N个具有独立存储空间的实体表.系统读写时 ...

  5. Mysql分区、分表、分库

    1.MySQL分区 一般情况下我们创建的表对应一组存储文件,使用MyISAM存储引擎时是一个.MYI和.MYD文件,使用Innodb存储引擎时是一个.ibd和.frm(表结构)文件. 当数据量较大时( ...

  6. MySql分区、分表和分库

    MySql分区.分表和分库 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈.需要进行数据的处理,采用的手段是分区.分片.分库.分表. 一些问题的解释: 1.为什么要分表和分区? 日常开发中 ...

  7. 【MySQL】数据库(分库分表)中间件对比

    分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表 ...

  8. MySQL性能优化(五):分表

    原文:MySQL性能优化(五):分表 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbi ...

  9. Oracle Spatial分区应用研究之一:分区与分表查询性能对比

    1.名词解释 分区:将一张大表在物理上分成多个分区,逻辑上仍然是同一个表名. 分表:将一张大表拆分成多张小表,不同表有不同的表名. 两种数据组织形式的原理图如下: 图 1分表与分区的原理图 2.实验目 ...

随机推荐

  1. BZOJ4259: 残缺的字符串 & BZOJ4503: 两个串

    [传送门:BZOJ4259&BZOJ4503] 简要题意: 给出两个字符串,第一个串长度为m,第二个串长度为n,字符串中如果有*字符,则代表当前位置可以匹配任何字符 求出第一个字符串在第二个字 ...

  2. [NOI2002] Robot 解题报告(数论+DP)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1408 Description 3030年,Macsy正在火星部署一批机器人. 第1秒,他 ...

  3. Mojo For Chromium Developers1

    Mojo For Chromium Developers Overview This document contains the minimum amount of information neede ...

  4. 旧机器安装ArchLinux的各种问题

    昨天突然想到家里还有一台很早之前不用的计算机 于是打算安装一个linux,开学再拿到宿舍用来写代码,怎么说台式机显示屏也比笔记本的大 机器安装问题 屏幕机箱擦干净,该连的东西都连上,然后插电源,本以为 ...

  5. easyui-combobox实现取值范围的联动

    需求:需要用两个combobox来输入一个年月的范围,下拉框的内容从服务器获取.需要实现选中前者后,后者的下拉框中不能显示比前者数值小的:选中后者后,前者的下拉框内容不能显示比后者数值大的 有两个co ...

  6. Rman备份及不完全恢复操作

    最后更新时间:2018/12/18 启用归档 --检查是否为归档 SQL> archive log list; Database log mode              No Archive ...

  7. 实现一个函数clone,可以对JS中的5种数据类型(Number、String、Object、Array、Boolean)进行值复制

     实现一个函数clone,可以对JS中的5种数据类型(Number.String.Object.Array.Boolean)进行值复制

  8. cocos2d-x 学习资源整理(持续更新...)

    生活像一把无情刻刀.改变了我们模样.以前我以为会亘古不变的东西,突然在一瞬间失去了信念... 假设你改变不了生活中患得患失的心情.那就试着让自己变得强大一点.由于能做到不以物喜不以己悲都是建立在强大的 ...

  9. unix mkdir命令的使用方法

    [语法]:   mkdir [-m 模式] [-p]  文件夹名 [说明]:  本命令用于建立文件夹,文件夹的存取模式由掩码(umask)决定,要求对其父文件夹具有写权限,文件夹的UID和GID为实际 ...

  10. Consolas 字体

    Consolas是一套等宽字体的字型,属无衬线字体,由Lucas de Groot设计. 概述 这套字型使用了微软的ClearType 字型平滑技术,并随同Windows Vista.Office 2 ...