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


Answers:


294

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


5
如果主索引始终被索引,为什么人们在谈论数据库体系结构/性能时总是建议SQL新手“确保其数据库已正确索引”?
蒂姆·彼得森2013年

35
@tim:他们告诉人们要确保用于过滤,分组或排序的其他任何列也都具有索引。
埃米尔·H

15
别忘了加入!索引连接字段加快了工作速度。
JustJohn '16


16

即使在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树,而MEMORY表也支持哈希索引。



9

您不必显式为主键创建索引...默认情况下会完成。


8

我想这就是答案

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)

7

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

  • 索引会减慢插入和更新的速度,因此您要在频繁更新的列上谨慎使用它们。
  • 索引可以加快where子句和排序依据。记住要考虑在构建表时如何使用数据。还有一些其他事情要记住。如果您的表很小,即只有几个员工,那么使用索引比将索引留给表只让它进行表扫描要糟。

  • 索引实际上仅在具有很多行的表中派上用场。

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

  • 别忘了加入!索引连接字段加快了工作速度。


4

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

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

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

因为您要索引主键并对其施加唯一性约束,所以实际上最终要在foo!上创建三个索引。


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.