主键是不是在 MySQL 中自动建立索引?

Posted

技术标签:

【中文标题】主键是不是在 MySQL 中自动建立索引?【英文标题】:Is the primary key automatically indexed in MySQL?主键是否在 MySQL 中自动建立索引? 【发布时间】:2010-11-07 10:57:06 【问题描述】:

需要显式创建索引,还是在定义主键时隐式创建? MyISAM 和 InnoDB 的答案是否相同?

【问题讨论】:

【参考方案1】:

是的,可以将主键列视为任何其他索引列,具有主键带来的约束。

在大多数用例中,我们需要主键和表中的索引列/列,因为我们对表的查询可能会根据不是主键的列/列过滤行,在这种情况下,我们通常会索引那些列/列。

【讨论】:

【参考方案2】:

主键总是自动索引并且是唯一的。因此,请注意不要创建冗余索引。

例如,如果您创建了一个这样的表

CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
  UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;

因为您想索引主键并对其强制执行唯一性约束,您实际上最终会在 foo! 上创建三个索引!

【讨论】:

【参考方案3】:

索引最适合用于经常在 where 子句中使用的列,以及任何类型的排序,例如“order by”。 您可能正在处理一个更复杂的数据库,因此最好记住一些简单的规则。

索引会减慢插入和更新速度,因此您需要在经常更新的列上谨慎使用它们。

索引加速 where 子句和排序依据。 请记住在构建表时考虑如何使用您的数据。 还有一些其他的事情要记住。如果您的表非常小,即只有几个员工,则使用索引比将其省略并让它进行表扫描更糟糕。

索引实际上只在具有大量行的表中派上用场。

要记住的另一件事是,在我们员工数据库的情况下,如果列是可变长度的,则索引(以及大多数 mysql)的执行效率要低得多。

不要忘记加入!索引连接字段加快速度。

【讨论】:

【参考方案4】:

我想这就是答案

mysql> create table test(id int primary key, s varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> show indexes from test \G
*************************** 1. row ***************************
        Table: test
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)

【讨论】:

【参考方案5】:

尽管在 2009 年有人问过这个问题,但我想我会在主键上发布对 MySQL 文档的实际参考。 http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

表的主键表示列或列集 您在最重要的查询中使用的。 它有一个关联的索引, 快速查询性能

有关 MySQL 5.0 参考,请参阅:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

大多数 MySQL 索引PRIMARY KEY、UNIQUE、INDEX 和 FULLTEXT)是 存储在 B 树中。例外是空间数据类型的索引 使用 R-trees,而且 MEMORY 表也支持哈希索引。

【讨论】:

【参考方案6】:

您不必为主键显式创建索引...这是默认完成的。

【讨论】:

【参考方案7】:

主键总是被索引的。这对于 MyISAM 和 InnoDB 来说是相同的,并且对于所有支持索引的存储引擎通常都是如此。

【讨论】:

如果主键总是被索引,为什么人们在谈论数据库架构/性能时总是建议 SQL 新手“确保他们的数据库被正确索引”? @tim:他们告诉人们确保用于过滤、分组或排序的任何其他列也有索引。 别忘了加入!索引连接字段加快速度。【参考方案8】:

根据http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html,这似乎是隐含的

【讨论】:

我在提问之前通过搜索找到了该链接。但这对我来说似乎并没有暗示这个问题或其他任何东西。 此答案中链接到的页面似乎没有说明主键是否也是索引。来自@fyrye 的answer 链接到的页面更相关。【参考方案9】:

主键被隐式索引为 MyISAM 和 InnoDB。您可以通过在使用主键的查询上使用 EXPLAIN 来验证这一点。

【讨论】:

以上是关于主键是不是在 MySQL 中自动建立索引?的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库怎么让id自动增长,但ID不是主键。难道只有ID为主键时,才可以自增的么?

Mysql运维管理-创建索引知识及创建索引的多种方法实战9

phpmyadmin的MySQL数据库中,主键、索引、唯一,各是啥意思。。?

mysql索引

mysql中,索引,主键,唯一索引,联合索引的区别是?对数据库的性能有啥影响?

mysql建立索引的一些小规则