在 MySQL 中使用 INDEX 与 KEY 有什么区别?

问题描述 投票:0回答:6

我知道如何使用 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 官方页面上找不到任何解释。谁能告诉我

KEY
INDEX
有什么区别吗?

我看到的唯一区别是,当我使用

KEY ...
时,我需要重复这个词,例如
KEY order_date ( order_date )

mysql indexing key
6个回答
347
投票

没有什么区别。它们是同义词,但应该首选

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 ) );
...虽然

下面这两个陈述(对于orders4

orders5
)彼此等效,但
但不是与上面的3个陈述,因为这里KEY
INDEX
的同义词INDEX
,不是
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 )

)


16
投票
这是关于“差异”的

很好的描述

“MySQL要求每个Key也被索引,这是一个实现 特定于 MySQL 的细节以提高性能。”


10
投票
键是在表中扮演非常特定角色的特殊字段,键的类型决定了它在表中的用途。

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

所以...

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

来源:为凡人设计的数据库

作者:迈克尔·埃尔南德斯


7
投票
在“创建表”文档中提到它是

INDEX

 的同义词:
MySQL 5.5 参考手册 :: 13 SQL 语句语法 :: 13.1 数据定义语句 :: 13.1.17 CREATE TABLE 语法

@Nos 已经引用了该部分并链接了 5.1 的帮助。

就像

PRIMARY KEY

为您创建主键和索引一样,
KEY
 仅创建索引。


0
投票
键是一组列或表达式,我们在其上构建索引。

  1. 虽然索引是存储在数据库中的结构,但键严格来说是一个逻辑概念。

  2. 索引帮助我们快速访问记录,而键只是唯一标识记录。

  3. 每个表都必然有一个键,但有索引不是强制性的。

检查

https://docs.oracle.com/cd/E11882_01/server.112/e40540/indexiot.htm#CNCPT721


0
投票
如果使用 InnoDB 引擎(现在很常见),则主键有重要的特殊规则。 来自:

https://dev.mysql.com/doc/refman/8.4/en/innodb-index-types.html

如果指定主键,InnoDB引擎将使用该主键作为聚集索引(数据行按该索引/键的顺序存储,以便按该顺序高效检索)

如果您不指定主键,文档会说:

如果没有为表定义 PRIMARY KEY,InnoDB 将使用所有键列定义为 NOT NULL 的第一个 UNIQUE 索引作为聚集索引

如果您不指定主键

表没有唯一索引,则:

如果表没有 PRIMARY KEY 或合适的 UNIQUE 索引,InnoDB 会在包含行 ID 值的合成列上生成名为 GEN_CLUST_INDEX 的隐藏聚集索引。

© www.soinside.com 2019 - 2024. All rights reserved.