分区表

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

  • 数据量非常大, 或者仅仅有表中最后的部分有热点数据。其它均为历史数据
  • 分区表数据更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. webi和universe

    Universe是一个包含以下内容的文件: 1 一个或多个数据库中间件的连接参数. 2 称为对象的SQL结构,映射到数据库中的实际SQL结构,如列,表和数据库函数.其中对象是按类分组的.用户既可以看到 ...

  2. IHttpHandler的学习(0)

    本片文章转自网络 问题1:什么是HttpHandler?(Handler:处理者:那就是对Http请求的处理拉) 问题2:什么是HttpModule? 问题3:什么时候应该使用HttpHandler什 ...

  3. NSStream 流式思想

    流式思想的本质是将数据或信号看作流.流的管理者NSStream看作管道. 内容包含两方面: 1.流的建立:源.目的地: 2.流的管理:状态事件与数据事件. 本质上是建立联系.处理数据.处理状态.

  4. vue中的分页操作

    首先,先看分页的代码: 这里还需要进行操作: 1.分页操作主要传递俩个数据,total和pagenum,一个显示当前页面共有多少条数据,一个是翻页后的操作,看列表的数据能不能跟着改变,在进页面发送请求 ...

  5. laravel5.0 自定义服务类

    一.创建加密服务类 在 app\services 目录下创建 Encrypt.php <?php namespace App\Services; class Encrypt { } 二.注册服务 ...

  6. linux下python3源码安装及卸载

    Linux下Python3的源码编译安装和卸载方法 [日期:2019-06-21] 来源:博客园  作者:wuli潇萧 [字体:大 中 小]     (一)Linux下软件的源码编译安装和卸载方法 L ...

  7. Oracle基础入门(三)

    一:PLsql一些基本操作 调节plsql的字体大小 二:创建表,如果学过sql server的数据库就会发现其实Oracle跟的一些新建表和新增修改其实是差不多的 新建表 Create table ...

  8. 【转】NPOI使用手册

    [转]NPOI使用手册 NPOI使用手册 目录 1.认识NPOI 2. 使用NPOI生成xls文件 2.1 创建基本内容 2.1.1创建Workbook和Sheet 2.1.2创建DocumentSu ...

  9. 智能指针的->和 * 重载

  10. 三星N900(note3)刷机包 颓废N0.8.1 修复已知BUG 集成谷歌服务

    ROM介绍 8.1更新信息:攻克了来电后点击HOME出现SECPHONE已经停止的问题 去掉了桌面隐藏信息的选项,官方最新底包暂不支持这功能 增加了网友们须要验证的谷歌服务(不须要的同学同步什么的都关 ...