264

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

4

9 回答 9

313

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

于 2009-07-01T20:24:32.530 回答
32

根据http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html,这似乎是隐含的

于 2009-07-01T20:25:27.503 回答
17

尽管这是在 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-trees,并且 MEMORY 表也支持散列索引。

于 2012-12-20T19:28:30.583 回答
11

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

于 2009-07-01T20:25:05.227 回答
9

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

于 2009-07-01T20:24:49.377 回答
9

我想这就是答案

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)
于 2015-08-28T07:37:12.500 回答
8

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

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

  • 索引实际上只在具有大量行的表中派上用场。

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

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

于 2016-07-27T10:58:38.197 回答
6

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

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

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

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

于 2016-11-25T15:09:17.033 回答
1

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

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

于 2020-05-08T07:06:50.397 回答