2012-11-11 19 views
0

我讀了一個地方,不應該在表的列上創建很多索引,因爲它會降低操作的性能。MySQL在UNIQUE NOT NULL列上創建索引

但是,當我創建一個具有UNIQUE NOT NULL字段的表時,MySQL正在自己創建所有字段上的索引。這不會降低性能嗎?如果是,我需要更改默認行爲的標誌?如果不是,那麼我錯在哪裏?

我的表:

CREATE TABLE Users(
Id_usr INT UNSIGNED NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(Id_usr), 
Email_id varchar(45) UNIQUE NOT NULL, 
username varchar(30) UNIQUE NOT NULL, 
userpass varchar(30) NOT NULL 
); 

當我看到phpMyAdmin的表:

Indexes: Documentation 
Action Keyname Type Unique Packed Column Cardinality Collation Null Comment 
Edit Edit Drop Drop PRIMARY BTREE Yes No Id_usr 0 A  
Edit Edit Drop Drop Email_id BTREE Yes No Email_id 0 A  
Edit Edit Drop Drop username BTREE Yes No username 0 A  
+1

索引是一種折衷。它們減緩了表寫入操作(即插入和更新),同時加快了讀取操作(即選擇,重複檢查等)。如果你希望MySQL在列上強制執行唯一性約束,那麼在該列上使用索引是正確的方法。除非您意識到這是一個問題,否則不要過早微觀地優化額外索引的成本。 – eggyal

+1

索引的一般經驗法則是將任意字段放在'where','join'或'order by'中使用的任何字段上。索引有助於加快搜索速度,其代價是減慢插入/更新。如果您從未將某個字段用作除存儲位置之外的任何字段,則不要對其編制索引。 –

回答

1

但是,當我創建一個UNIQUE NOT NULL字段的表時,MySQL正在自己創建所有字段上的索引。

不,Mysql僅在您告訴它的那些字段上創建索引。 當你在最後創建一個包含UNIQUE的列時,這意味着你要告訴mysql在該列上添加UNIQUE索引

因此對於兩個UNIQUE列有兩個索引。主鍵有一個索引。共有3個指標。 userpass列沒有索引。因爲你沒有告訴它。

如果你需要索引,你知道你爲什麼需要UNIQUE索引,然後只需添加它。現在不要考慮表現。部署後如果遇到任何性能問題,請考慮優化。

1

性能降低是因爲需要而寫更新指標。另一方面,創建索引以加速選擇。

MySQL無法在不創建索引的情況下實施唯一性在每次插入或更新時掃描整個表,這會對性能造成更大影響。幸運的是,你不能改變這種行爲。