主键是否在MySQL中被自动索引?

你需要显式地创build一个索引,或者在定义主键时是隐式的吗? MyISAM和InnoDB的答案是一样的吗?

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

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

尽pipe在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树中。 例外情况是空间数据types的索引使用R树,并且MEMORY表也支持散列索引。

您不必显式地为主键创build索引…这是默认完成的。

我想这是答案

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) 

索引最适用于where子句中经常使用的列,以及任何types的sorting,例如“order by”。 您可能正在研究更复杂的数据库,所以最好记住一些简单的规则。

  • 索引减慢插入和更新,所以你想仔细使用它们在频繁更新的列上。
  • 索引加速where子句和order by。 请记住在构build表格时要考虑如何使用数据。 还有其他一些事情要记住。 如果你的表非常小,也就是说只有几个员工,那么使用索引要比留下索引更糟糕,只是让它进行表扫描。

  • 索引真的只能用于有很多行的表格。

  • 还有一件事要记住,那就是在员工数据库的情况下,如果列是可变长度的,那么索引(以及大多数MySQL)的执行效率要低得多。

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

主键始终是自动索引和唯一的。 所以,不要创build冗余索引。

例如,如果你创build了一个表

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

因为你想索引主键并强制唯一性约束,你最终会在foo上创build三个索引!