首页 文章

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

提问于
浏览
216

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

8 回答

  • 10

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

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

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

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

  • 28

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

  • 13
  • 7

    即使在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表也支持哈希索引 .

  • 1

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

  • 3

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

  • 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)
    
  • 252

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

    • 索引会降低插入和更新的速度,因此您要在经常更新的列上小心使用它们 .

    • 索引加快了子句和顺序的位置 . 请记住考虑在构建表时如何使用您的数据 . 还有一些其他事情需要记住 . 如果您的表非常小,即只有少数员工,那么使用索引比将其丢弃并让它进行表扫描更糟糕 .

    • 索引实际上只对具有大量行的表格派上用场 .

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

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

相关问题