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

时间:2016-12-22 19:19:54

标签: mysql sql clustered-index non-clustered-index

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

例如:

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

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

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

2 个答案:

答案 0 :(得分:7)

TL; DR主键 - 主键 - 是聚簇索引。如果没有明确定义主键,则第一个适合{使用了{1}}密钥。如果您没有 主键或合适的UNIQUE键,MySQL会生成隐藏的聚簇索引。您无法使用UNIQUE创建聚簇索引。

作为explained in the docs(强调补充):

  

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

     

...

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

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

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

  •   
     

...

     

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

另请参阅definition of clustered index in the glossary,它将其定义为“主键索引的InnoDB术语”,以及一些其他详细信息。

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

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

答案 1 :(得分:1)

  

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

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