欢迎光临

我们一直在努力
当前位置:首页 > 互联网 >

MySQL 分区表,为什么分区键必须是主键的一部分?

日期:
后台-插件-广告管理-首页/栏目/内容广告位一(PC)
后台-插件-广告管理-首页/栏目/内容广告位一(手机)

随着业务的不断发展,数据库中的数据会越来越多,相应地,单表的数据量也会越到越大,大到一个临界值,单表的查询性能就会下降。

这个临界值,并不能一概而论,它与硬件能力、具体业务有关。

虽然在很多 MySQL 运维规范里,都建议单表不超过 500w、1000w。

但实际上,我在生产环境,也见过大小超过 2T,记录数过亿的表,同时,业务不受影响。

单表过大时,业务通常会考虑两种拆分方案:水平切分和垂直切分。

水平拆分 VS 垂直拆分

水平切分,拆分的维度是行,一般会根据某种规则或算法将表中的记录拆分到多张表中。

拆分后的表既可在一个实例,也可在多个不同实例中。如果是后者,又会涉及到分布式事务。

垂直切分,拆分的维度是列,一般是将列拆分到多个业务模块中。这种拆分更多的是上层业务的拆分。

从改造的复杂程度来说,前者小于后者。

所以,在单表数据量过大时,业界用得较多的还是水平拆分。

常见的水平拆分方案有:分库分表、分区表。

虽然分库分表是一个比较彻底的水平拆分方案,但一方面,它的改造需要一定的时间;另一方面,它对开发的能力也有一定的要求。相对来说,分区表就比较简单,也无需业务改造。

分区表

很多人可能会认为 MySQL 的优势在于 OLTP 应用,对于 OLAP 应用就不太适合,所以,也不太推荐分区表这种偏 OLAP 的特性。

但实际上,对于某些业务类型,还是比较适合使用分区表的,尤其是那些有明显冷热数据之分,且数据的冷热与时间相关的业务。

下面,我们看看分区表的优点:

  1. 提升查询性能

    对于分区表的查询操作,如果查询条件中包含分区键,则这个查询操作就只会被下推到符合条件的分区内进行,无关分区将自动过滤掉。

    在数据量比较大的情况下,能提升查询速度。

  2. 对业务透明

    将表从一个非分区表转换为分区表,业务端无需做任何改造。

  3. 管理方便

    在对单个分区进行删除、迁移和维护时,不会影响到其它分区。

    尤其是针对单个分区的删除(DROP)操作,避免了针对这个分区所有记录的 DELETE 操作。

遗憾的是,MySQL 分区表不支持并行查询。理论上,当一个查询涉及到多个分区时,分区与分区之间应进行并行查询,这样才能充分利用多核 CPU 资源。

但 MySQL 并不支持,包括早期的官方文档,也提到了这个问题,也将这个功能的实现放到了优先级列表中。

These features are not currently implemented in MySQL Partitioning, but are high alt="MySQL 分区表,为什么分区键必须是主键的一部分? " height="449" loading="lazy" src="https:///d/file/20240124/3ce75dcd6a8c942d22c6c16bc16e3cb4.png" width="814" />

结合原理图,我们来看看两种索引之间的区别:

  1. 本地分区索引同时也是分区索引,分区索引和表分区之间是一一对应的。

    而全局索引,既可以是分区的,也可以是不分区的。

    如果是全局分区索引,一个分区索引可对应多个表分区,同样,一个表分区也可对应多个分区索引。

  2. 对本地分区索引的管理操作只会影响到单个分区,不会影响到其它分区。

    而对全局分区索引的管理操作会造成整个索引的失效,当然,这一点可通过 UPDATE INDEXES 子句加以规避。

  3. 本地分区索引只能保证分区内的唯一性,无法保证表级别的唯一性,但全局分区可以。

  4. 在 Oracle 中,无论是索引组织表还是堆表,如果要创建本地唯一索引,同样也要求分区键必须是唯一键的一部分。

    SQL> create unique index uk_opr_no_local on opr_oracle(opr_no) local;
    create unique index uk_opr_no_local on opr_oracle(opr_no) local
                                           *
    ERROR at line 1:
    ORA-14039: partitioning columns must form a subset of key columns of a UNIQUE
    index
    [!--empirenews.page--]

总结

1. MySQL 分区表关于“分区键必须是唯一键(主键和唯一索引)的一部分”的限制,本质上是索引组织表的限制。

2. MySQL 分区表只实现了本地分区索引,没有实现全局索引,所以无法保证非分区列的全局唯一。

如果要保证非分区列的全局唯一,只能依赖业务实现了。

3. 不推荐使用 MyISAM 分区表。当然,任何场景都不推荐使用 MyISAM 表。

后台-插件-广告管理-首页/栏目/内容广告位二(PC)
后台-插件-广告管理-首页/栏目/内容广告位二(手机)
后台-插件-广告管理-内容广告位三(PC)
后台-插件-广告管理-内容广告位三(手机)

相关阅读

后台-插件-广告管理-内容广告位四(PC)
后台-插件-广告管理-内容广告位四(手机)

聚合标签

热门文章

后台-插件-广告管理-侧边广告位一(PC)
后台-插件-广告管理-侧边广告位一(手机)
  • Windows主机中localhost与127.0.0.1的区别是什么?

  • localhost与127.0.0.1的区别是什么? 相信有人会说是本地IP,曾有人说,用127.0.0.1比localhost好,可以减少一次解析。 这个理解是错误的,其实这两者是有区别的。 localhost也叫l
  • c盘满了怎么清理垃圾而不误删

  • 今天分享的主题是:c盘爆满发出警告如何清理又不误删系统文件。如果你也不会的话就看看下面的经验吧。 c盘满了怎么清理垃圾而不误删 1、很多人在清理c盘垃圾的时候会误删
  • steam怎么退款?

  • 有的时候我们在steam上买了游戏,但是却发现自己的电脑无法加载这款游戏,这时候我们就会想到退款,那么steam如何退款呢?下面小编就来给大家介绍一下。 steam怎么退款? 1、在ste
  • 电脑怎么录屏?如何录制电脑屏幕操作?

  • 如何录制电脑屏幕操作,相信很多朋友们遇到过这种类似的问题,你们对于这类问题如何解决呢?下面就给大家分享一下个人经验,希望可以帮助到大家。 电脑怎么录屏? 方法一:手机录制。
  • 手机如何投屏到电脑?(手机投屏电脑方法)

  • 每次都有新手机发布会,总会提到采用多少英寸的屏幕,但是手机在大的屏幕,也没有手机投屏到电脑、电视的体验爽,下面就一起来看看手机如何投屏到电脑? 手机投屏电脑方法 1、打开
后台-插件-广告管理-侧边广告位二(PC)
后台-插件-广告管理-侧边广告位二(手机)

最新文章

  • MySQL 分区表,为什么分区键必须是主键的一部分?

  • 随着业务的不断发展,数据库中的数据会越来越多,相应地,单表的数据量也会越到越大,大到一个临界值,单表的查询性能就会下降。这个临界值,并不能一概而论,它与硬件能力、具体业务有关
  • MySQL中如何选择合适的备份策略和备份工具

  • 数据库备份的重要性毋庸置疑,可以说,它是数据安全的最后一道防线。鉴于此,对于备份,我们通常会做以下要求: 多地部署 对于核心数据库,我们通常有两地三中心的部署要求。对于备份
  • MySQL中 VARCHAR 可设置的最大长度是多少?

  • 在使用MySQL的过程中,在存储字符串时,大家或许都有过这样或那样的困惑,譬如:1. 对于固定长度的字符串,为什么推荐使用 CHAR 来存储?2. VARCHAR 可设置的最大长度是多少?3. 给定
  • Binlog分析利器-binlog_summary.py

  • Binlog中,除了具体的SQL,其实,还包含了很多有价值的信息,如, 事务的开始时间。 事务的结束时间。 事务的开始位置点。 事务的结束位置点。 操作的开始时间(一个事务通常会包含多个
  • Handler_read_*的总结

  • 在分析一个SQL的性能好坏时,除了执行计划,另外一个常看的指标是"Handler_read_*"相关变量。 Handler_read_key Handler_read_first Handler_read_last Handler_read_next
后台-插件-广告管理-侧边广告位三(PC)
后台-插件-广告管理-侧边广告位三(手机)