MySQL « Нужно ли делать индексы для столбцов, на которые существуют внешние ключи

Есть несколько таблиц InnoDB с внешними ключами друг на друга. Нужно ли делать индексы для столбцов, на которые существуют внешние ключи?

Т.е. есть:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .mysql.geshi_code {font-family:monospace;} .mysql.geshi_code .imp {font-weight: bold; color: red;} .mysql.geshi_code .kw1 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw2 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw3 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw4 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw5 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw6 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw7 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw8 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw9 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw10 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw11 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw12 {color: #009900;} .mysql.geshi_code .kw13 {color: #000099;} .mysql.geshi_code .kw14 {color: #000099;} .mysql.geshi_code .kw15 {color: #000099;} .mysql.geshi_code .kw16 {color: #000099;} .mysql.geshi_code .kw17 {color: #000099;} .mysql.geshi_code .kw18 {color: #000099;} .mysql.geshi_code .kw19 {color: #000099;} .mysql.geshi_code .kw20 {color: #000099;} .mysql.geshi_code .kw21 {color: #000099;} .mysql.geshi_code .kw22 {color: #000099;} .mysql.geshi_code .kw23 {color: #000099;} .mysql.geshi_code .kw24 {color: #000099;} .mysql.geshi_code .kw25 {color: #000099;} .mysql.geshi_code .kw26 {color: #000099;} .mysql.geshi_code .kw27 {color: #00CC00;} .mysql.geshi_code .coMULTI {color: #808000; font-style: italic;} .mysql.geshi_code .co1 {color: #808080; font-style: italic;} .mysql.geshi_code .co2 {color: #808080; font-style: italic;} .mysql.geshi_code .es0 {color: #004000; font-weight: bold;} .mysql.geshi_code .es1 {color: #008080; font-weight: bold;} .mysql.geshi_code .br0 {color: #FF00FF;} .mysql.geshi_code .sy1 {color: #CC0099;} .mysql.geshi_code .sy2 {color: #000033;} .mysql.geshi_code .st0 {color: #008000;} .mysql.geshi_code .nu0 {color: #008080;} .mysql.geshi_code span.xtra { display:block; }

CREATE TABLE `ufl_updates` (
  `ID` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  `ID_source` INT(3) UNSIGNED NULL DEFAULT NULL COMMENT 'manual ID from update provider',
  `CreatedDate` DATETIME NULL DEFAULT NULL COMMENT 'when source was created',
  `StartTime` DATETIME NULL DEFAULT NULL COMMENT 'when update had started',
  `FinishTime` DATETIME NULL DEFAULT NULL COMMENT 'when update had finished',
  PRIMARY KEY (`ID`),
  INDEX `sourceId` (`ID_source`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=63;


CREATE TABLE `ufl_updates_rows` (
  `ID` INT(12) UNSIGNED NOT NULL AUTO_INCREMENT,
  `ID_update` INT(5) UNSIGNED NOT NULL,
  `Code` VARCHAR(12) NULL DEFAULT NULL,
  `Articul` VARCHAR(10) NULL DEFAULT NULL,
  `ArticulPost` VARCHAR(50) NULL DEFAULT NULL,
  `Supplier` VARCHAR(50) NULL DEFAULT NULL,
  `Name` VARCHAR(100) NULL DEFAULT NULL,
  `IsActual` TINYINT(1) UNSIGNED NULL DEFAULT NULL,
  `Rest` INT(8) NULL DEFAULT NULL,
  PRIMARY KEY (`ID`),
  INDEX `updateId` (`ID_update`),
  INDEX `isActual` (`IsActual`),
  CONSTRAINT `FK_ufl_updates_rows_ufl_updates` FOREIGN KEY (`ID_update`) REFERENCES `ufl_updates` (`ID`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=580412;


CREATE TABLE `ufl_updates_rows_prices` (
  `ID` INT(15) UNSIGNED NOT NULL AUTO_INCREMENT,
  `ID_update` INT(5) UNSIGNED NOT NULL DEFAULT '0',
  `ID_row` INT(12) UNSIGNED NOT NULL,
  `ValuePrice` FLOAT(12,2) UNSIGNED NULL DEFAULT '0.00',
  `RateNDS` INT(3) UNSIGNED NULL DEFAULT '0',
  `Currency` VARCHAR(3) NULL DEFAULT NULL,
  PRIMARY KEY (`ID`),
  INDEX `rowId` (`ID_row`),
  INDEX `FK_ufl_updates_rows_prices_ufl_updates` (`ID_update`),
  CONSTRAINT `FK_ufl_updates_rows_prices_ufl_updates` FOREIGN KEY (`ID_update`) REFERENCES `ufl_updates` (`ID`) ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT `FK_ufl_updates_rows_prices_ufl_updates_rows` FOREIGN KEY (`ID_row`) REFERENCES `ufl_updates_rows` (`ID`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=586856;
 


Нужно ли делать дополнительные индексы на ufl_updates_rows.ID_update, ufl_updates_rows_prices.ID_update, ufl_updates_rows_prices.ID_row ? Или внешние референсы - выполнят роль индексов?

P.S. Знаю про explain =) Просто сейчас идет нагрузочное тестирование для операций добавления, оно закончится не ранее, чем через 5 часов. Хотелось бы узнать теоретическую сторону вопроса, а то нагуглить быстро не получилось...

1 ответов


Вообще в большинстве случаев нужно. Но в Mysql выбора нету - они создаются автоматически при создании внешнего ключа, если не существует индекса. Кстати, в Вашем случае абсолютно лишний индекс по tinyint полю (насколько я понимаю, он будет использоваться как флаг)


 INDEX `isActual` (`IsActual`)