主键在MySQL中自动索引吗?

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

94772 次浏览

主键总是被索引。对于MyISAM和InnoDB也是如此,对于所有支持索引的存储引擎也是如此。

你不必显式地为主键创建索引…这是默认的。

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

尽管这是在2009年被问到的问题,但我认为我应该发布一个关于主键的MySQL文档的实际引用。 http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html < / p >
表的主键表示列或列集 用在最重要的问题上。它有一个关联索引, 快速查询性能

MySQL 5.0参考参考:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

大多数MySQL 索引 (主键, UNIQUE, INDEX,和FULLTEXT)是 存储在b树中。例外情况是空间数据类型上的索引 使用r -树,内存表也支持哈希索引

我想这就是答案

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子句中经常使用的列,以及任何类型的排序,例如“order by”。 您可能正在处理一个更复杂的数据库,因此最好记住一些简单的规则
  • 索引会降低插入和更新的速度,因此要在频繁更新的列上谨慎使用索引。
  • 索引加速where子句和排序。 记住,在构建表时,要考虑如何使用数据。 还有一些其他的事情要记住。如果您的表非常小,即只有几个雇员,使用索引比不使用索引并让它做表扫描更糟糕

  • 索引确实只在有很多行的表中才有用。

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

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

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

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

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

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

是的,我们可以把主键列看作是任何其他索引列,只是带有主键的约束。

在大多数情况下,我们既需要主键,也需要索引表中的列/列,因为我们对表的查询可能会基于非主键的列/列来过滤行,在这种情况下,我们通常也会索引那些列/列。