我知道如何使用索引如下代码。我知道如何使用外键和主键。

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而不是索引如下。

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

    KEY order_date ( order_date )
)

我在MySQL的官方页面上找不到任何解释。有人能告诉我KEY和INDEX有什么区别吗?

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


没有区别。它们是同义词,尽管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可以看到:

Table 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 )
)

在“create table”文档中,它是INDEX的同义词: MySQL 5.5参考手册::13 SQL语句语法::13.1数据定义语句::13.1.17 CREATE TABLE语法

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

像PRIMARY KEY一样,为你创建一个主键和一个索引, KEY只创建索引。


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

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

所以…

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

来源:Database Design for Mere Mortals

作者:Michael Hernandez


下面是关于“区别”的一个很好的描述:

“MySQL要求每个Key都被索引,这是一种实现 具体到MySQL,以提高性能。”


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

索引是存储在数据库中的结构,而键是严格意义上的逻辑概念。 索引帮助我们快速访问记录,而键只是唯一地标识记录。 每个表都必须有一个键,但索引不是强制性的。

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