簡體   English   中英

主鍵是否在 MySQL 中自動索引?

[英]Is the primary key automatically indexed in MySQL?

是否需要顯式創建索引,還是在定義主鍵時隱式創建? MyISAM 和 InnoDB 的答案是否相同?

主鍵始終被索引。 這對於 MyISAM 和 InnoDB 是相同的,並且對於所有支持索引的存儲引擎通常都是如此。

盡管這是在 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 表也支持散列索引。

MyISAM 和 InnoDB 的主鍵都是隱式索引的。 您可以通過在使用主鍵的查詢上使用 EXPLAIN 來驗證這一點。

您不必為主鍵顯式創建索引……默認情況下已完成。

我想這就是答案

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)

索引最適合用於 where 子句中經常使用的列,以及任何類型的排序,例如“order by”。 您可能正在處理更復雜的數據庫,因此最好記住一些簡單的規則。

  • 索引會減慢插入和更新的速度,因此您希望在頻繁更新的列上謹慎使用它們。
  • 索引加速 where 子句和 order by。 記住在構建表時要考慮如何使用數據。 還有一些其他的事情要記住。 如果您的表非常小,即只有幾個員工,那么使用索引比不使用索引並讓它進行表掃描更糟糕。

  • 索引實際上只在有很多行的表中派上用場。

  • 另一件要記住的事情是,在我們員工數據庫的情況下,如果列是可變長度的,索引(以及大多數 MySQL)的執行效率會低得多。

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

主鍵總是自動索引並且是唯一的。 因此,請注意不要創建冗余索引。

例如,如果您創建了一個這樣的表

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

因為您想索引主鍵並對其實施唯一性約束,您實際上最終會在foo上創建三個索引!

可以將主鍵列視為具有主鍵約束的任何其他索引列。

在大多數用例中,我們需要表中的主鍵和索引列/列,因為我們對表的查詢可能會根據不是主鍵的列/列過濾行,在這種情況下,我們通常對這些列/列進行索引以及。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM