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

Ale*_*ler 237 mysql database indexing key

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

Emi*_*l H 284

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

  • @tim:他们告诉人们确保用于过滤,分组或排序的任何其他列也有索引. (34认同)
  • 不要忘记加入!索引连接字段可以加快速度. (14认同)
  • 如果主键始终被索引,为什么人们在谈论数据库体系结构/性能时总是建议SQL新手"确保他们的数据库被正确编入索引"? (4认同)

fyr*_*rye 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树,而MEMORY表也支持哈希索引.


小智 10

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


Ric*_*ick 8

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


小智 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)
Run Code Online (Sandbox Code Playgroud)


dr0*_*r01 7

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

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

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

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


小智 6

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

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

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

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

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