簡體   English   中英

MySQL-索引innodb外鍵

[英]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在內部自動創建。 但是您需要在usersid )和jobsid )上建立索引,以便對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.

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