mysql - 是否可以基于两个键/索引创建分区表达式?

时间:2014-08-11 15:14:42

标签: mysql relational-database partitioning database-partitioning

如果我有一个表,可以说有5亿行,其中包含两个主要的单个索引。表格如下:

CREATE TABLE `t1` (
    id_1 bigint unsigned not null,
    id_2 bigint unsigned not null,
    col3, col4 ... colN ...
    KEY `index1` (`id_1`),
    KEY `index2` (`id_2`),
    ...
) ENGINE=InnoDB;

表上100%的查询都在index1或index2上使用 WHERE 子句。

考虑到这一点,并假设现在非常合理的时间将该表分区为100个分区,我只需要理解这两个问题:

  1. 是否可以创建分区表达式,以便在分区之后,对于使用其中一个索引的任何查询:

    SELECT * FROM `t1` WHERE id_1 = 123;
    -- or
    SELECT * FROM `t1` WHERE id_2 = 456;
    

    引擎只扫描一个分区?

  2. 问题1必须在不更改索引的情况下发生。我的意思是,没有在其中回放引用,因为它会耗费太多RAM。所以,这绝不可能发生:

    KEY `index1` (`id_1`,`id_2`),
    KEY `index1` (`id_2`,`id_1`),
    
  3. 怎么样?任何人吗?

    修改

    有人在dba.stackexchange.com上回答了,所以如果有兴趣的话,我会在这里提供参考资料。

1 个答案:

答案 0 :(得分:0)

你正在咆哮多个错误的树木。

"使用where"不是邪恶的。 KEY(id_1)WHERE id_1=123执行如下操作:

  1. (非常快)找到该索引中的第一个id_1 = 123(结构为BTree)。
  2. (与123'的数量成比例)线性扫描索引。
  3. (也是成比例的,但速度较慢)到达有问题的行。
  4. 任何形式的分区都不可能加速任何形式。

    KEY index1id_1id_2)不会生活在RAM"中。它ia"缓存在RAM"如所须。是的,这比KEY(id_1)稍大,但不足以担心。如果您每个人都需要WHERE id_1=123 AND id_2=456,那么复合索引会快得多。

    (id_1,id_2)是唯一的吗?如果是,并且您现在没有PRIMARY KEY,那么这将是最佳的:

    PRIMARY KEY(id_1, id_2),
    INDEX(id_1)
    

    没有任何分区。 PK对WHERE id_1=123非常有效。 INDEX适用于WHERE id_2=456