[英]MySQL - indexing innodb foreign keys
在InnoDB中索引外鍵的性能是否有所提高? 據我所讀 ,InnoDB自動為外鍵創建索引。
這是給我創建表的查詢。
DROP TABLE IF EXISTS `assignments`;
CREATE TABLE `assignments`
(
`id` INTEGER NOT NULL AUTO_INCREMENT,
`user` INTEGER NOT NULL,
`job` INTEGER NOT NULL,
`created_at` DATETIME,
`updated_at` DATETIME,
PRIMARY KEY (`id`),
INDEX `job_fk1` (`user`),
INDEX `job_fk2` (`job`),
CONSTRAINT `job_fk1`
FOREIGN KEY (`user`)
REFERENCES `users` (`id`),
CONSTRAINT `job_fk2`
FOREIGN KEY (`job`)
REFERENCES `jobs` (`id`)
) ENGINE=InnoDB;
在其中,他創建了名為job_fk1和job_fk2的外鍵。 他使用這些外鍵的名稱作為索引的名稱。
在InnoDB中索引外鍵的性能是否有所提高?
答:不能。由於重復的密鑰,性能會降低。
你不需要
INDEX `job_fk1` (`user`),
INDEX `job_fk2` (`job`),
這些將由InnoDB在內部自動創建。 但是您需要在users
( id
)和jobs
( id
)上建立索引,以便對assignments
表進行更快的操作
http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
“ InnoDB需要在外鍵和引用鍵上建立索引,以便外鍵檢查可以快速進行,而無需進行表掃描。在引用表中,必須有一個索引,其中外鍵列以相同的順序列為第一列如果這樣的索引不存在,則會在引用表上自動創建(這與某些舊版本相反,在舊版本中,必須顯式創建索引,否則將無法創建外鍵約束。)index_name,如果給定,如前所述。”
您是正確的,當創建外鍵約束時,MySQL將在列上創建索引(如果尚不存在)。 但是,請隨時在列上創建索引,並根據需要刪除自動生成的索引。
您可能還需要其他多列索引來輔助此類查詢:
SELECT id, user, job
FROM assignments
WHERE job = 5
ORDER BY user
多列索引(job, user)
將同時滿足搜索和排序的需要,並且由於輔助索引包括主鍵,因此在這種情況下,它也將用作覆蓋索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.