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

时间:2009-07-01 20:21:27

标签: mysql database indexing key

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

9 个答案:

答案 0 :(得分:268)

主键始终为索引编制。对于MyISAM和InnoDB来说,这是相同的,对于所有支持索引的存储引擎来说都是如此。

答案 1 :(得分:29)

答案 2 :(得分:15)

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

答案 3 :(得分:10)

主键是MyISAM和InnoDB的隐式索引。您可以使用EXPLAIN对使用主键的查询进行验证。

答案 4 :(得分:8)

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

答案 5 :(得分:7)

我想这就是答案

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)

答案 6 :(得分:4)

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

  • 索引会降低插入和更新的速度,因此您希望在经常更新的列上小心使用它们。
  • 索引加快了子句和顺序的位置。 请记住考虑在构建表时如何使用您的数据。 还有一些其他事情需要记住。如果您的桌子非常小,即只有少数员工,那么使用索引比将其丢弃更糟,只是让它进行表扫描。

  • 索引真的只对有很多行的表格派上用场。

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

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

答案 7 :(得分:1)

主键始终自动编入索引且唯一。所以,请注意不要创建冗余索引。

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

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

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

答案 8 :(得分:0)

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

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