【问题标题】:Index in partitioned table分区表中的索引
【发布时间】:2015-07-07 02:40:08
【问题描述】:

MySQL 如何为分区表创建索引,例如,如果我按 ID 分区创建 5 个哈希:

  • 为所有数据创建 1 个全局索引,5 个分区将使用该索引
  • 使用 5 个分区表中的子数据创建 5 个分区索引
  • 用5个分区表中的所有数据创建5个索引

谢谢

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    MySQL 中没有分区表的“全局”索引。

    您可以放在分区表上的唯一索引最终是每个分区上的单独索引。每个分区实际上都是一个独立的表。

    HASH 分区实际上是无用的;你有什么特别的用途,你认为它可能是有益的吗?

    附录...

    索引的大小类似于表的大小。

    由于没有“全局”索引,因此您不能拥有 UNIQUE 键,除非它包含“分区键”的列。也不能使用FOREIGN KEYs

    没有一种类型的索引可以跨越多个表。

    【讨论】:

    • 原因是知道 MySQL 如何在分区表上创建索引有助于我清楚地了解它是如何工作的,并帮助我估计大小或调整性能。
    【解决方案2】:

    Mysql 中的分区表只支持本地索引。 这意味着什么?表的每个分区都为索引存储自己的 B-Tree。如果您没有分区键作为索引的一部分,这可能会减慢搜索过程。同样对于唯一键约束,您需要添加分区键作为唯一键的一部分。

    相对于 Mysql,Oracle 也有全局索引的概念。全球索引很难管理。

    我不太确定如果忽略全局索引,Mysql 分区会有多大帮助。

    【讨论】:

    • “如果您没有分区键作为索引的一部分,这会减慢搜索过程” – 怎么样?如果您将分区键作为 WHERE 子句的一部分,partition pruning 已经将其缩小到相应的分区。如果没有,由于要分区的索引的性质,无论如何都必须查找所有索引分区。那么包含分区键不会不必要地扩大索引,因此相反是正确的 - 或者我在这里错过了什么?
    • 同意,但我们正在考虑我们的搜索是在分区键不属于的索引上的情况。在这种情况下,DB Engine 将不得不在所有分区中搜索键,因为 MySql 没有全局索引的概念。
    • 您的意思是如果 WHERE 不包含“分区键”而是 PK(例如 PK 是 id,分区键是 created_date,而 WHERE 只有 id between 100 and 500 之类的东西)?然后确实它必须解析与分区一样多的索引,对。但是对于id between 100 and 500 and created_date = $xcreated_date 是否在某个索引中无关紧要——由于修剪,只会扫描相关分区。但是,是的,在“计划”时必须考虑到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2017-02-21
    • 2014-05-13
    • 2023-03-10
    • 2016-06-07
    • 2015-03-09
    • 2019-09-27
    相关资源
    最近更新 更多