一、分区表

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. Mybatis第六篇【配置文件和映射文件再解读、占位符、主键生成与获取、Mapper代理】

    配置文件和映射文件再解读 映射文件 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象,mapper.xml以statement为单位管理 ...

  2. unity3D写一个hello world

    unity3D写一个hello world 打开unity并且在assets建立一个新的文件,新的文件命名为hello world.unity.接着创建一个新的C#Sript脚本文件,命名为hello ...

  3. Spring+SpringMVC+MyBatis整合进阶篇(四)RESTful实战(前端代码修改)

    前言 前文<RESTful API实战笔记(接口设计及Java后端实现)>中介绍了RESTful中后端开发的实现,主要是接口地址修改和返回数据的格式及规范的修改,本文则简单介绍一下,RES ...

  4. python pyinstaller打包exe暗坑1

    环境 python2.7.9 win-xp 今天打包了一个小脚本,结果打开报错

  5. Go语言下载、安装、配置、使用

    Go语言 Go语言(Golang,The Go Programming Language),是谷歌2009发布的第二款开源编程语言.2009年7月份,谷歌曾发布了Simple语言,它是用来开发Andr ...

  6. 关于js浮点数计算精度不准确问题的解决办法

    今天在计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前就一直碰到这个问题,都是简单的使用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的.因此在网上收集了一些处理浮点数精 ...

  7. Qt学习之路MainWindow学习过程中的知识点

    一.Qt的GUI程序有一个常用的顶层窗口,叫做MainWindow MainWindow继承自QMainWindow.QMainWindow窗口分成几个主要的区域:   二.QAction类 QAct ...

  8. hdu 4778 Gems Fight! 状态压缩DP

    Gems Fight! Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others)T ...

  9. Button标签自动刷新问题

    在form表单中,button标签在IE浏览器 type类型默认是button ,而在其他浏览器默认是submit. 解决方法1: 设置类型type="button" <bu ...

  10. jdbc与mybatis区别

    jdbc的缺点: 1.频繁创建连接,浪费资源 2.SQL语句硬编码,不利于维护 3.传参是硬编码,不利于维护 4.结果集是硬编码,不利于维护 但是mybatis很好的解决了这些问题.