繁体   English   中英

INDEX()是否在MySQL中创建了聚簇索引或非聚簇索引?

[英]Does INDEX() create a clustered or non-clustered index in MySQL?

我正在学习在CREATE TABLE语句中使用INDEX()的教程,但不解释它是集群还是非集群。 我的问题是:在CREATE TABLE语句中使用INDEX()导致聚簇索引还是非聚簇索引?

例如:

CREATE TABLE test (a varchar(30), b varchar(30), index(a));

/* Is column A a clustered or non-clustered index? */

还想知道如何做相反的事情:如果示例导致非聚集索引,您如何编写聚簇索引,反之亦然?

TL; DR主键 - 只有主键 - 是聚簇索引。 如果未明确定义主键,则使用第一个合适的UNIQUE键。 如果你没有任何主键或合适的UNIQUE键,MySQL的生成一个隐藏的聚集索引。 您无法使用INDEX()创建聚簇索引。

正如文档中解释的 (强调添加):

每个InnoDB表都有一个称为聚簇索引的特殊索引,其中存储了行的数据。 通常,聚簇索引与主键同义。

...

  • 在表上定义PRIMARY KEY时,InnoDB将其用作聚簇索引。 为您创建的每个表定义主键。 如果没有逻辑唯一且非空列或列集,请添加一个新的自动增量列,其值将自动填充。

  • 如果没有为表定义PRIMARY KEY ,MySQL会找到第一个UNIQUE索引,其中所有键列都是NOT NULL而InnoDB将它用作聚簇索引。

  • 如果表没有PRIMARY KEY或合适的UNIQUE索引,InnoDB会在包含行ID值的合成列内部生成隐藏的聚簇索引。 行按InnoDB分配给此类表中的行的ID排序。 行ID是一个6字节的字段,随着新行的插入而单调增加。 因此,由行ID排序的行在物理上处于插入顺序。

...

除聚簇索引之外的所有索引都称为辅助索引。 在InnoDB中,辅助索引中的每条记录都包含该行的主键列以及为辅助索引指定的列。 InnoDB使用此主键值来搜索聚簇索引中的行。

另请参阅词汇表中聚簇索引定义 ,该定义将其定义为“主键索引的InnoDB术语”以及一些其他详细信息。

因此,要回答您的问题,除了创建主键或在没有主键的表上创建合适的UNIQUE键(所有键列NOT NULL)之外,无法创建聚簇索引。 INDEX()只是创建一个辅助(即非聚集)键,无论你用它做什么。

*注意:正如注释中所指出的,其他一些数据库根本没有聚簇索引,有些数据库允许在表上使用多个聚簇索引。 我只在答案中解决MySQL问题。

A列是聚簇索引还是非聚簇索引?

它是非聚集索引,只有主键字段具有聚簇索引。 请记住,表中只能有一个聚簇索引,因此它肯定无法创建一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM