Wiz*_*Wiz 12 mysql sql clustered-index
我正在阅读有关聚簇索引如何工作的所有内容,并认为它们对我的应用程序有益.我知道主键是自动聚簇索引,但是如何将聚簇索引添加到非主键列?
即用户帖子的数据存储区.每个帖子都有一个ID,但也有一个用户ID,但由于用户可以多次发帖,因此user-id不是主键.如何将聚集索引添加到用户ID,这是一个好主意?
Ola*_*che 18
根据Clustered和Secondary Indexes,每个表只能有一个聚簇索引.
除聚簇索引之外的所有索引都称为辅助索引.
如果表没有主索引而是另一个唯一索引,则将其用作聚簇索引.
如果没有为表定义PRIMARY KEY,MySQL会找到第一个UNIQUE索引,其中所有键列都是NOT NULL,而InnoDB将它用作聚簇索引.
因此,我得出结论,您不会自己添加聚簇索引,但MySQL会选择表的主要或第一个唯一索引作为聚簇索引.
正如@Olaf描述的那样,InnoDB选择哪个列或列组合将成为聚簇索引(主键,如果没有主键,则为第一个唯一索引;如果两个都没有,则选择隐藏列).
如果要将非唯一列作为聚簇索引,则可以将其定义post_id为唯一键,user_id并将post_id主键和组合键作为聚簇索引进行组合:
CREATE TABLE Post
( post_id INT NOT NULL AUTO_INCREMENT
, user_id INT NOT NULL
--- other columns
, CONSTRAINT Post_PK
PRIMARY KEY (user_id, post_id) -- your clustered index
, CONSTRAINT post_id_UQ
UNIQUE (post_id) -- you still want uniqueness for the `post_id`
) ENGINE = InnoDB ;
Run Code Online (Sandbox Code Playgroud)
这是否是一个好主意取决于您的应用程序,数据量和您拥有的查询.通常,群集密钥的最佳属性是唯一的,窄的,静态的和不断增加的.这就是为什么自动递增列最好的原因.在Kimberly L. Tripp的博客文章中了解它:不断增加的聚类键 - 聚集索引辩论..........再次!和集群索引辩论继续...(不要因为它们是针对SQL-Server而停止,同样的问题适用于InnoDB的聚集索引99%)
像这样的聚类键(user_id, post_id)具有前3个属性,但它不会增加.这将导致CI碎片化,并可能导致表中插入速度变慢.
然而,它将产生具有WHERE user_id = ?条件或范围条件WHERE user_id BETWEEN ? AND ?或GROUP BY user_id分组的更有效的查询,因为所需数据将在聚集索引中在一个地方以所需顺序找到.
我建议您进行测试,以选择最适合您的情况.
还有一个MySQL变体TokuDB,允许在表中使用多个聚簇索引.文章中的详细信息:介绍多个聚类索引