一、分区表

1. 什么是分区表?

对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成(所以索引也是按照分区的子表定义的,

而没有全局索引)。实现分区的代码实际上是对一组底层表的句柄对象的封装。对分区表的请求,都会通过句柄对象

转化成对存储引擎的接口调用。

MySQL在创建表时,使用partition by子句定义每个分区存放的数据。在执行查询的时候,优化器会根据分区定义

过滤那些没有我们需要数据的分区。

分区的一个主要目的是将数据按照一个较粗的粒度分布在不同的表中,这样可以将相关的数据存放在一起,如果想

一次批量删除整个分区的数据也会变得很方便。

2. 分区表发挥大作用的场景:

(1)表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他均是历史数据。

(2)分区表的数据更容易维护。

(3)分区表的数据可以分布在不同的物理设备上。

(4)可以使用分区表来避免某些特殊的瓶颈,例如InnoDB单个索引的互斥访问。

(5)如果需要,还可以备份和恢复独立的分区,这在非常大的数据集的场景下效果非常好。

3. 分区表的限制:

(1)一个表最多只能有1024个分区。

(2)在MySQL5.1中,分区表达式必须是整数,或者是返回整数的表达式。在MySQL5.5中,某些场景中可以直接使用

列来进行分区。

(3)如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来。

(4)分区表中无法使用外键约束。

(5)所有分区都必须使用相同的存储引擎。

(6)分区函数中可以使用的函数和表达式也有一些限制。

(7)某些存储引擎不支持分区。

(8)对于MyISAM表,使用分区表时需要打开更多的文件描述符。

4. 分区表的原理:

存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎),分区表的索引

只是在各个底层表上各自加上一个完全相同的索引。

在分区表上的查询操作都需要分区层首先打开并锁住所有的底层表,然后确定需要操作的分区,最后再采取相应

操作。

5. 分区表的类型:

MySQL支持范围、键值、哈希、列表分区。其中有些还支持子分区,通过子分区可以将数据切成多个小片,大大

降低互斥量的竞争问题。

分区表达式可以是列,也可以是列的表达式,可以使用各种函数,但是返回的值要是一个确定的整数,且不能是一

个常数。

6. 如何使用分区表:

分区不需要精确定位每条数据的位置,所以无须额外的数据结构记录每个分区有哪些数据,代价非常低,只需要一个

简单的表达式就可以表达每个分区存放的是什么数据。

保证大量数据可扩展性的两个策略:

(1)全量扫描数据,不要任何索引。

(2)索引数据,并分离热点。

7. 什么情况下会出现问题:

(1)NULL值会使分区过滤无效

分区表达式的值可以是NULL,对应的记录会存放到第一个分区中。例如,如果按partition by range year(order_date)分

区,那么所有order_date为NULL或是一个非法值的时候,记录都会被放到第一个分区。查询某个范围的数据记录时MySQL

会检查包含第一个分区在内的两个分区,如果第一个分区非常大的话代价会很大。

解决方法:

<1> 创建一个没用的分区。例如上面的例子可以使用partition p_nulls values less than (0)来创建第一个分区。

<2> 在MySQL5.5之后可以直接使用列本身而不是基于列的函数进行分区:partition by range columns (order_date)。

(2)分区列和索引列不匹配

如果定义的索引列和分区列不匹配,会导致查询无法进行分区过滤。

(3)选择分区的成本可能很高

范围分区找到目标分区服务器需要扫描所有的分区定义列表,随着分区数增长,成本会越来越高。在应用开发中应该

限制分区数量,一般100左右已经够用了。其他分区类型则没有这个问题。

(4)打开并锁住所有底层表的成本可能很高

当查询访问分区表的时候,MySQL需要打开并锁住所有的底层表,这个操作在分区过滤之前发生,所以无法通过分区

过滤降低此开销,并且该开销和分区类型无关,会影响所有查询。这对一些本身操作非常快的查询会带来明显的额外开销。

解决方法:

使用批量操作的方式来降低单个操作的此类开销,例如使用批量插入、一次删除多行数据,等等。

(5)维护分区的成本可能很高

重组分区或类似alter语句的操作,需要复制数据。

8. 查询优化:

(1)在where条件中带入分区列,即使看似多余,这样优化器通过分区过滤可以让查询扫描更少的数据。可以使用explain

partitions观察优化器是否执行了分区过滤。

(2)MySQL只能在使用分区列本身进行比较时才能过滤分区,而不能根据基于分区列的表达式的值去过滤分区,即使这个

表达式就是分区表达式也不行。

(3)若分区表是关联操作的第二张表,且关联条件是分区键,MySQL就只会在对应的分区里匹配行。但explain无法显示这

种情况下的分区过滤,因为这是运行时的分区过滤,而不是查询优化阶段的。

二、合并表

1. 什么是合并表?

合并表是一种早期的、简单的分区实现,和分区表相比有一些不同的限制,并且缺乏优化。分区表严格来说是一个逻辑

上的概念,用户无法访问底层的各个分区,但是合并表允许用户单独访问各个字表。分区表和优化器的结合更紧密,这也是

未来发展的趋势,而合并表是一种即将被淘汰的技术。

合并表其实就是使用一个merge存储引擎逻辑表来封装多个myisam存储引擎物理子表,逻辑表和子表的结构完全相同

(包括字段、索引等)。删除一个合并表,它的子表不会受任何影响,而如果删除其中一个子表则可能会有不同的后果,

这要视操作系统而定。

2. 合并表的一些限制和行为:

(1)在使用create语句创建一个合并表的时候,并不会检查各个子表的兼容性。如果子表的定义稍有不同,那么MySQL

就可能创建出一个无法使用的合并表。

(2)在合并表上无法使用replace语法,无法使用自增字段。

(3)如果一个查询访问合并表,那么它需要访问所有子表,这有时候会导致很差的性能,应该对子表的个数进行限制。

3. 分区所不能提供的特性:

(1)一个MyISAM表可以是多个合并表的子表。

(2)可以通过直接复制.frm、.MYI、.MYD文件来实现在不同的服务器之间复制各个子表。

(3)在合并表中可以很容易地添加新的子表,直接修改合并表的定义就可以了。

(4)可以创建一个合并表,让它只包含需要的数据。

(5)如果相对某个子表做备份、恢复、修改、修复或者别的操作时,可以先将其从合并表中删除,操作结束后再将其加回去。

(6)可以使用myisampack工具来压缩所有的子表。

MySQL分区表与合并表的更多相关文章

  1. mysql用merge合并表

    merge合并表的要求 1.合并的表使用的必须是MyISAM引擎 2.表的结构必须一致,包括索引.字段类型.引擎和字符集 实例: create table if not exists user1( i ...

  2. MySQL 分区表

    转载自MySQL 分区表 今天统计数据的时候发现一张表使用了表分区,借此机会记录一下. 1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分.从逻辑上看, ...

  3. Mysql --分区表的管理与维护

    改变一个表的分区方案只需使用alter table 加 partition_options 子句就可以了.和创建分区表时的create table语句很像 创建表 CREATE TABLE trb3 ...

  4. MySQL分区表基础

    首先要确定MySQL是否支持分区: Mysql> SHOW VARIABLES LIKE '%partition%'; +-----------------------+-------+| Va ...

  5. MySQL 分区表原理及数据备份转移实战

    MySQL 分区表原理及数据备份转移实战 1.分区表含义 分区表定义指根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分.实际上,表的不同部分在不同的位置被存储为单独的表.用户所选择的.实现 ...

  6. 详解MySQL分区表

    当数据库数据量涨到一定数量时,性能就成为我们不能不关注的问题,如何优化呢? 常用的方式不外乎那么几种: 1.分表,即把一个很大的表达数据分到几个表中,这样每个表数据都不多. 优点:提高并发量,减小锁的 ...

  7. MySql分区、分表和分库

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

  8. MySQL分区表

    当数据库数据量涨到一定数量时,性能就成为我们不能不关注的问题,如何优化呢? 常用的方式不外乎那么几种: 1.分表,即把一个很大的表达数据分到几个表中,这样每个表数据都不多. 优点:提高并发量,减小锁的 ...

  9. mysql 多行合并一列

    mysql  多行合并一列 使用的函数为: GROUP_CONCAT(exp) 其中exp 的参数类似如下: (field order  by field   desc  separator ';') ...

随机推荐

  1. 【Socket编程】通过Socket实现UDP编程

    通过Socket实现UDP编程 UDP通信: 1.UDP协议(用户数据报协议)是无连接.不可靠.无序的. 2.UDP协议以数据报作为数据传输的载体. 3.使用UDP进行数据传输时,首先需要将要传输的数 ...

  2. Oracle与Mysql区别简述

    在Mysql中,一个用户下可以创建多个库: 而在Oracle中,Oracle服务器是由两部分组成 数据库实例[理解为对象,看不见的] 数据库[理解为类,看得见的] 一个数据库实例可拥有多个用户,一个用 ...

  3. 【机器学习实战】Machine Learning in Action 代码 视频 项目案例

    MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 Machine Learning in Action (机器学习实战) | ApacheCN(apa ...

  4. 异常处理第一讲(SEH),筛选器异常,以及__asm的扩展,寄存器注入简介

    异常处理第一讲(SSH),筛选器异常,以及__asm的扩展 博客园IBinary原创  博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 一丶__Asm的 ...

  5. 初学者---AngularJS详解

    AngularJS 简介 AngularJs是一个用于设计动态web应用的结构框架.首先,它是一个框架,不是类库,提供一整套方案用于设计web应用.它不仅仅是一个javascript框架,因为它的核心 ...

  6. MultipleOutputs新旧api

    package MRNB_V4; import java.io.IOException; import java.util.Iterator; import org.apache.hadoop.con ...

  7. Local Binary Convolutional Neural Networks ---卷积深度网络移植到嵌入式设备上?

    前言:今天他给大家带来一篇发表在CVPR 2017上的文章. 原文:LBCNN 原文代码:https://github.com/juefeix/lbcnn.torch 本文主要内容:把局部二值与卷积神 ...

  8. php多态

    多态性是指相同的操作或函数.过程可作用于多种类型的对象上并获得不同的结果.不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性. 多态性允许每个对象以适合自身的方式去响应共同的消息.多态性 ...

  9. Atlas框架介绍集成(一)

    Atlas是什么? Atlas是一个Android客户端容器框架,主要提供了组件化.动态性.解耦化的支持.支持在编码期.Apk运行期以及后续运维修复期的各种问题. 在工程期,实现工程独立开发,调试功能 ...

  10. ASP.NET Core中如何调整HTTP请求大小的几种方式

    一.前言 一般的情况下,我们都无需调用HTTP请求的大小,只有在上传一些大文件,或者使用HTTP协议写入较大的值时(如调用WebService)才可能会调用HTTP最大请求值. 在ASP.NET Co ...