一、分区表

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. 关于学习Python的一些心得

    1.关注函数参数的类型,如列表,字符串,int,而不是关注函数的功能 2.导入模块numpy,dir(numpy) 查看所有属性 3.''.join(列表)  将列表拆成字符串

  2. Play使用

        play框架   打包命令: play war e:/codes/cn.ngmc.frontend -o f:/backup_ngmc/20160614frontend_001Dev; 即:p ...

  3. 渗透相关website

    开源安全测试方法论:http://www.isecom.org/research/osstmm.html 信息系统安全评估框架:www.oissg.org/issaf 开放式web应用程序安全项目(O ...

  4. 移动端touch事件实现页面弹动--小插件

    动手之前的打盹 说实话真的是好久没有更新博客了,最近一直赶项目,身心疲惫:最关键的是晚上还要回去上一波王者,实在是忙啊! 这周下来,清闲了些许,或许是因为要到国庆的缘故吧,大家都显得无精打采.俗话说的 ...

  5. java集合系列——List集合之ArrayList介绍(二)

    一:List概述 List是 java.util包下面的类,从<a href="http://blog.csdn.net/u010648555/article/details/5604 ...

  6. 基于NIO的Socket通信

    一.NIO模式的基本原理: 服务端: 首先,服务端打开一个通道(ServerSocketChannel),并向通道中注册一个通道调度器(Selector):然后向通道调度器注册感兴趣的事件Select ...

  7. 安卓App提交应用商店时遇到的两个小问题

    陆陆续续做了一个半月左右的「喵呜天气」终于在今天下午成功提交到应用商店(腾讯应用宝).期间遇到两个小问题,记录如下: 1.上传安装包失败,提示「无法获取签名信息,请上传有效包(110506)」. 安装 ...

  8. Linux CentOS 7 防火墙/端口设置

    CentOS升级到7之后用firewall代替了iptables来设置Linux端口, 下面是具体的设置方法: []:选填 <>:必填 [<zone>]:作用域(block.d ...

  9. 分页查询不知你是否真正的懂和PHP的正则的应用和一些性能优化

    一.不废话太多  直接进入例子. 1  问题: 有一张收藏表,里面存储的是用户和图书ID.数据量为1亿.现在要求分页获取所有用户ID(不重复),写下你的sql语句.   表结构大致如下:       ...

  10. Spring事务管理配置示例

    (一).Spring事务特性 1.事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度. ISOLATION_DEFAULT:默认值,使用数据库的默认隔离级别,就是ISOLATION_READ_C ...