使用MySQL中的INDEX和KEY有什么区别?

245

我知道如何使用以下代码中的INDEX。我也知道如何使用外键主键

CREATE TABLE tasks ( 

    task_id        int unsigned NOT NULL AUTO_INCREMENT, 
    parent_id      int unsigned NOT NULL DEFAULT 0, 
    task           varchar(100) NOT NULL, 
    date_added     timestamp    NOT NULL, 
    date_completed timestamp        NULL, 

    PRIMARY KEY ( task_id ), 
    INDEX parent ( parent_id )
)

然而我发现以下代码使用了KEY而不是INDEX

CREATE TABLE orders (
    
    order_id        int unsigned NOT NULL AUTO_INCREMENT,
    -- etc 

    KEY order_date ( order_date )
)

我在官方MySQL页面上找不到任何解释。有人能告诉我KEYINDEX之间的区别吗?

我唯一看到的区别是当我使用KEY ...时,我需要重复单词,例如KEY order_date ( order_date )

5个回答

338

它们没有区别,是同义词,不过应该使用INDEX(因为INDEX符合ISO SQL规范,而KEY是MySQL特定的、非便携式扩展)。

CREATE TABLE手册条目中可以看到:

KEY通常是INDEX的同义词。当在列定义中给出时,关键属性PRIMARY KEY也可以指定为KEY。这是为了与其他数据库系统兼容而实现的。


通过“当在列定义中给出时,关键属性PRIMARY KEY也可以指定为KEY”这句话,意味着以下三个CREATE TABLE语句等效,在数据库中生成相同的TABLE对象:

CREATE TABLE orders1 (
    order_id int PRIMARY KEY
);

CREATE TABLE orders2 (
    order_id int KEY
);

CREATE TABLE orders3 (
    order_id int NOT NULL,

    PRIMARY KEY ( order_id )
);

虽然下面这两个语句(针对orders4orders5)彼此等效,但与上面的3个语句不同,在这里KEYINDEXINDEX的同义词,而不是主键PRIMARY KEY

CREATE TABLE orders4 (
    order_id int NOT NULL,

    KEY ( order_id )
);

CREATE TABLE orders5 (
    order_id int NOT NULL,

    INDEX ( order_id )
);

由于KEY ( order_id )INDEX ( order_id )成员并没有定义一个PRIMARY KEY,而只是定义了一个通用的INDEX对象,它根本不像一个KEY(因为它不能唯一地标识一行)。

通过运行SHOW CREATE TABLE orders1...5可以看到:

表格 SHOW CREATE TABLE...
orders1 CREATE TABLE orders1 (
order_id int NOT NULL,
PRIMARY KEY ( order_id )
)
orders2 CREATE TABLE orders2 (
order_id int NOT NULL,
PRIMARY KEY ( order_id )
)
orders3 CREATE TABLE orders3 (
order_id int NOT NULL,
PRIMARY KEY ( order_id )
)
orders4 CREATE TABLE orders4 (
order_id int NOT NULL,
KEY ( order_id )
)
orders5 CREATE TABLE orders5 (
order_id int NOT NULL,
KEY ( order_id )
)

1
在最新版本的 SQLYog 中查看表信息时,它显示了 KEY keyname (column_name),而我创建表时使用的是 INDEX keyname (column_name)。这是因为它们是同义词,这一事实解释得非常完美。 - crmpicco
2
关键属性 PRIMARY KEY 在列定义中也可以仅指定为 KEY。这是什么意思? - Zyl
关键属性 PRIMARY KEY 在列定义中也可以仅指定为 KEY。请问如何实现? - Naeem Ul Wahhab
2
@Zyl 我更新了这个答案来回答你的问题。 - Dai
2
@NaeemUlWahhab 我已经更新了这个答案来回答你的问题。 - Dai

15

这里是一段有关 "区别" 的优秀描述

"MySQL要求每个键也必须被索引,这是MySQL特定的实现细节,旨在提高性能。"


5
这个问题涉及MySQL中SQL标识符KEY和INDEX的使用,而不是键和索引之间的区别。 - Josh J
1
我用搜索引擎查找了差异,并且这是第一个结果。在我看来,没有必要再开一个额外的问题。但如果你想的话,可以随意这样做。 - Stefan

10

键(Keys)是表中扮演特定角色的特殊字段,而键的类型决定了它在表中的作用。

索引(Index)是RDBMS(数据库管理系统)提供的一种结构,用于改善数据处理。索引与逻辑数据库结构无关。

所以...

键是用于在表中识别记录的逻辑结构,而索引是用于优化数据处理的物理结构。

来源:Database Design for Mere Mortals

作者:Michael Hernandez


6
问题涉及MySQL中的SQL标识符KEY和INDEX的用法,而不是键和索引之间的区别。 - Josh J
真的吗?我对问题的理解不同,我认为这个答案是唯一一个说明了区别的。 - funder7

7

0

4
这个问题是关于在MySQL中使用SQL标识符KEY和INDEX的。不是关于键和索引之间的区别。 - Josh J
1
@Josh J 即使最初的动机是关于标识符的问题,但使用搜索引擎搜索关键字和索引的区别会出现这个话题。改进问题标题以更具体的方式可能是有意义的。另一方面,在mysql中写一个关于键和索引之间区别的问题可能会被标记为重复。我发现这样的补充答案非常有用。“真正”的答案仍然会得到最高分。因此,我不认为补充答案应该受到负面评价的原因。 - Stefan
我��问题中将INDEX和KEY大写以明确表示。 - reinierpost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接