[英]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.