`
student_lp
  • 浏览: 429624 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

    mysql从5.0版本开始引入分区,对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理字表组成。实现分区的代码实际上是对一组底层表的句柄对象的封装。对分区表的请求,都会通过句柄对象转化成为存储引擎的接口调用。索引分区对于SQL层来说是一个完全封装底层实现的黑盒子,对于应用是透明的,但是从底层的文件系统很容易发现,每个分区表都有一个使用#分割命名的表文件。

1、分区表的实现

    mysql实现分区表的方式----对底层表的封装---意味索引也是按照分区的字表定义的,而没有全局索引。这个oracle不同,在oracle中可以更加灵活的定义索引和表是否进行分区。

    mysql在创建表时使用partition by定义每个分区存在的数据。在执行查询的时候,优化器会根据分区定义过滤那些没有我们需要数据的分区,这样查询就无须扫描所有分区--只需查找所包含的数据的分区就可以了。

2、分区表的作用

    分区在一下场景中起到非常大的作用:

  • 表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他均是历史数据;
  • 分区表的数据更容易维护。例如:想批量删除大量数据可以使用清除整个分区的方式。另外还可以对一个独立分区进行优化、检查、修改等操作。
  • 分区表的数据可以分布在不同的物理设备上,从而高效的利用多个硬件设备。
  • 可以使用分区表来避免特殊的瓶颈,例如InnoDB的单个索引的互斥访问、ext3文件系统的inode锁竞争等。
  • 如果需要,还可以备份和恢复独立的分区,这在非常大的数据集的场景下效果非常好。

3、分区的限制

  • 一个表最多只能有1024个分区;
  • 在mysql 5.1中,分区表达式必须是整数,或者是返回整数的表达式。在mysql5.5中,某些场景中可以直接使用列来进行分区。
  • 如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来。
  • 分区表中无法使用外键约束。

 4、分区表的原理

    分区表有多个相关的底层表实现,这些地层表也是有句柄对象表示,所以我们也可以直接访问各个分区。存储引擎管理分区的各个地层表和管理普通表一样,分区表的索引只是在各个底层表上各自加上一个完全相同的索引。从存储引擎的角度来看,底层表和一个普通表没有任何不同,存储引擎也无需知道这是一个普通表还是一个分区表的一部分。

    分区表上的操作可以按照下面的操作逻辑进行:

  •  select查询:当查询一个分区表的时候,分区层先打开并锁住所有底层表,优化器判断是否可以过滤部分分区,然后再调用对应的存储引擎接口访问各个分区的数据。
  • insert操作:当写入一条记录时,分区层先打开并锁住所有的底层表,然后确定那个分区接受这条记录,再将记录写入对应底层表。
  • delete操作:当删除一条记录时,分区层先打开并锁住所有的底层表,然后确定数据对应的分区,最后对相应表进行删除操作。
  • update操作:当更新一条记录时,分区层先打开并锁住所有的底层表,mysql先确定需要更新的记录在那个分区,然后取出数据并更新,在判断更新后的数据该放在那个分区,然后对底层表进行写入操作,并对原数据所在的底层表进行删除操作。

    虽然每个操作都会“先打开并锁住所有底层表”,但这并不是说分区表在处理过程中是锁住全表的。如果存储引擎能够自己实现行级锁,例如InnoDB,则会在分区层释放对应的表锁。

5、分区表的类型

    mysql支持多种分区表,最多的是根据范围进行分区,每个分区存储落在某个范围的记录,分区表达式可以是列,也可以是包含列的表达式。mysql还支持键值、哈希和列表分区。还有一些其他的分区技术包括:

  • 根据键值进行分区,来减少InnoDB的互斥竞争;
  • 使用数学模函数来进行分区,然后将数据轮询放入不同的分区。
  • 假设表有一个自增的主键列ID,希望根据时间将最近的热点数据集中存放。那么必须将时间戳包含在主键当中才行,而这和主键本身的意义相矛盾。这种情况下也可以使用这样的分区来实现相同的目的:HASH(id div 1000000),这将为100万数据建立一个分区。这样一方面实现了当初的分区目的,另一方面比起使用时间范围分区避免了一个问题,就是当超过一定阀值时,如果使用时间范围分区就必须新增分区。

6、如何使用分区表

    如果一张表数据量巨大,肯定不能每次查询都进行扫描全表。考虑到索引在空间和维护上的消耗,也不希望使用索引。这个时候两条路可选:让所有的查询只在数据表上做顺序扫描,或者将数据表和索引全部都缓存在内存里。

    在数据量超大的时候,b-tree索引就无法起作用了。除非是索引覆盖查询,否则数据库需要根据扫描的结果回表,查询所有符合条件的记录,如果数据量巨大,这将产生大量随机I/O,随之,数据库的响应时间将大到不可接受的程度。意识到这一点,于是就完全抛弃使用b-tree索引,而选择一些更粗粒度的但消耗更少的方式检索数据。

    这正是分区要做的事情。理解分区时还可以将其当做索引的最初形态,以代价非常小的方式定位到需要的数据在那一片“区域”。在这片“区域”中,你可以做顺序扫描,可以建索引,还可以将数据缓存到内存。因为分区无须额外的数据结构记录每个分区有那些数据,所以代价非常低,只需要一个简单的表达式就可以表达每个分区存放的是什么数据。

7、分区带来的问题

  • null值会使分区过滤无效:一个容易让人误解的地方就是分区表达式的值可以是null:第一个分区是一个特殊分区。假如按照partition by range year(order_date)分区,那么所有order_date为null或者一个非法值的时候,记录都会被存放在第一个分区。当查询的时候,例如:where order_date between '2012-01-01' and '2012-01-31'。实际上,mysql会检查两个分区,而不是之前猜想的一个。即检查2012分区和第一个分区。
  • 分区列和索引列不匹配:如果定义的索引列和分区列不匹配,会导致查询无法进行分区过滤。假设列a上定义了索引,而在列b上进行分区。因为每个分区都有其独立的索引,所以扫描列b上的索引就需要扫描每个分区内对应的索引。
  • 选择分区的成本可能很高:分区的类型很多,不同类型的分区实现也不相同,所以他们的性能也各不相同。尤其是范围分区,在查询过程中成本会很高,且随着分区数量的增长,成本会越来越高。
  • 打开并锁住所有底层表的成本可能很高:当查询访问分区表时,mysql需要打开并锁住所有的底层表,这是分区表的另一个开销。这个操作在分区过滤之前发生,索引无法通过分区过滤降低次开销,并且该开销也和分区类型无关,会影响所有的查询。
  • 维护分区的成本可能会很高:某些分区维护操作的速度会非常快(如add、delete),而有些操作,会开销很大(alter语句需要复制数据)
分享到:
评论

相关推荐

    MySQL 分区

    NULL 博文链接:https://marsvaadin.iteye.com/blog/1441361

    Oracle10个分区和Mysql分区区别详解

    MySQL分区常用的是:range、list、hash、key,Oracle10g分区常用的是:range(范围分区)、list(列表分区)、hash(哈希分区)、range-hash(范围—哈希分区)、range-list(列表—复合分区)。下面通过本文详细给...

    mysql表分区

    mysql表分区策略,包含range分区、list分区、hash分区等方法介绍及详解

    MySQL分区实战

    在互联网行业,MySQL数据库毫无疑问已经是最常用的数据库

    MySQL的表分区详解

    mysql5.1开始支持数据表分区了。如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区。当然也可根据其他的条件分区。二、为什么要对表进行分区为了改善大型表以及具有各种...

    MySQL交换分区的实例详解

    MySQL交换分区的实例详解 前言 在介绍交换分区之前,我们先了解一下 mysql 分区。 数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表...

    详解MySQL分区表

    本篇文章给大家带来的内容是关于MySQL中分区表的介绍及使用场景,有需要的朋友可以参考一下,希望对你有所帮助。 1.分区的目的及分区类型 MySQL在创建表的时候可以通过使用PARTITION BY子句定义每个分区存放的数据。...

    mysql分区功能详解,以及实例分析

    下面小编就为大家带来一篇mysql分区功能详解,以及实例分析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    MySQL分区表的局限和限制详解

    禁止构建 分区表达式不支持以下几种构建: 存储过程,存储函数,UDFS或者...在MySQL 5.7.1之前的分区表不支持HANDLER语句,以后的版本取消了这一限制。 服务器SQL模式 如果要用用户自定义分区的表的话,需要注意的是

    Navicat与Mysql详解

    对Navicat的配置,安装和使用以及Myaql的连接,部署,使用作了详细地介绍,并配图教学。

    新版 MySQL DBA 高级视频 基于MySQL 5.7 MySQL 8.0版本.rar

    │ 第十一课MySQL表分区8.0.pdf │ 第十七课Elasticsearch分享-张亚V4.pdf │ 第十三课MySQL5.7高可用架构之Mycat.pdf │ 第十三课MySQL8.0高可用架构之Mycat.pdf │ 第十九课MySQL备份和恢复.pdf │ 第十二课MySQL...

    MySQL的分区表(PartitionedTable)功能详解

    数据库分区是一种物理数据库设计技术。其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间,同时...MySQL从5.1版本开始支持分区,同个表中的分区表名称要唯一 主要有两种形式:水平分区和垂

    Mysql数据库从入门到精通.rar

    4.MySQL的数据类型和建库策略详解 5.MySQL多表操作和备份处理 6.MySQL索引分类和各自用途 7.MySQL中的字符串比较函数 8.MySQL中字符串函数详细介绍 9.都出深入SELECT语句的查询功能 10.浅谈MySQL存储引擎选择InnoDB...

Global site tag (gtag.js) - Google Analytics