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

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

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

mysql database indexing key
9个回答
330
投票

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



21
投票

尽管这个问题是在 2009 年提出的,但我想我会发布有关主键的 MySQL 文档的实际参考。

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

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

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


11
投票

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


11
投票

我想这就是答案

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)

9
投票

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


8
投票

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

  • 索引会减慢插入和更新速度,因此您需要在经常更新的列上小心使用它们。
  • 索引加快了 where 子句和 order by 的速度。 请记住在构建表时考虑如何使用数据。 还有一些其他事情需要记住。如果您的表非常小,即只有几个员工,那么使用索引比不使用索引并让它进行表扫描更糟糕。

  • 索引实际上只对有很多行的表有用。

  • 另一件事要记住,这是我们员工数据库的一个缺点,如果列是可变长度,索引(以及大多数 MySQL)的执行效率会低得多。

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


7
投票

主键始终自动索引且唯一。因此,请注意不要创建冗余索引。

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

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

因为您想要对主键建立索引并对其强制执行唯一性约束,所以实际上最终会在

foo

上创建三个索引

1
投票

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

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

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