如果我有一个表,可以说有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个分区,我只需要理解这两个问题:
是否可以创建分区表达式,以便在分区之后,对于使用其中一个索引的任何查询:
SELECT * FROM `t1` WHERE id_1 = 123; -- or SELECT * FROM `t1` WHERE id_2 = 456;
引擎只扫描一个分区?
问题1必须在不更改索引的情况下发生。我的意思是,没有在其中回放引用,因为它会耗费太多RAM。所以,这绝不可能发生:
KEY `index1` (`id_1`,`id_2`), KEY `index1` (`id_2`,`id_1`),
怎么样?任何人吗?
修改
有人在dba.stackexchange.com上回答了,所以如果有兴趣的话,我会在这里提供参考资料。
答案 0 :(得分:0)
你正在咆哮多个错误的树木。
"使用where"不是邪恶的。 KEY(id_1)
和WHERE id_1=123
执行如下操作:
任何形式的分区都不可能加速任何形式。
KEY index1
(id_1
,id_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
。