Должен ли я использовать таблицы MyISAM или InnoDB для моей базы данных MySQL?

У меня есть две следующие таблицы в моей базе данных (индексирование не является полным, поскольку оно будет основано на том, какой движок я использую):

Таблица 1:

CREATE TABLE `primary_images` (
  `imgId` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `imgTitle` varchar(255) DEFAULT NULL,
  `view` varchar(45) DEFAULT NULL,
  `secondary` enum('true','false') NOT NULL DEFAULT 'false',
  `imgURL` varchar(255) DEFAULT NULL,
  `imgWidth` smallint(6) DEFAULT NULL,
  `imgHeight` smallint(6) DEFAULT NULL,
  `imgDate` datetime DEFAULT NULL,
  `imgClass` enum('jeans','t-shirts','shoes','dress_shirts') DEFAULT NULL,
  `imgFamily` enum('boss','lacoste','tr') DEFAULT NULL,
  `imgGender` enum('mens','womens') NOT NULL DEFAULT 'mens',
  PRIMARY KEY (`imgId`),
  UNIQUE KEY `imgDate` (`imgDate`)
)

Таблица 2:

CREATE TABLE `secondary_images` (
  `imgId` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `primaryId` smallint(6) unsigned DEFAULT NULL,
  `view` varchar(45) DEFAULT NULL,
  `imgURL` varchar(255) DEFAULT NULL,
  `imgWidth` smallint(6) DEFAULT NULL,
  `imgHeight` smallint(6) DEFAULT NULL,
  `imgDate` datetime DEFAULT NULL,
  PRIMARY KEY (`imgId`),
  UNIQUE KEY `imgDate` (`imgDate`)
)

Таблица 1 будет использоваться для создания галереи миниатюр со ссылками на более крупные версии изображения. imgClass, imgFamily и imgGender будут уточнять отображаемые миниатюры.

Таблица 2 содержит изображения, связанные с таковыми в таблице 1. Следовательно, использование primaryId для связи одного изображения в таблице 1 с одним или несколькими изображениями в таблице 2. Это то, о чем я думал об использовании внешнего ключа способность InnoDB, но я также знаком с возможностью индексов в MyISAM делать то же самое.

Не вдаваясь слишком много в оставшиеся поля, imgDate используется для упорядочивания результатов.

Наконец, но не в последнюю очередь, я должен упомянуть, что эта база данных ТОЛЬКО ЧИТАЕТ. Все данные будут введены мной. Мне сказали, что если база данных только для чтения, она должна быть MyISAM, но я надеюсь, что вы можете пролить свет на то, что вы сделали бы в моей ситуации.

Ответ 1

По умолчанию используется InnoDB.

В MySQL 5.1 позже вы должны использовать InnoDB. В MySQL 5.1 вы должны включить плагин InnoDB. В MySQL 5.5 плагин InnoDB включен по умолчанию, поэтому просто используйте его.

Совет лет назад был тем, что MyISAM был быстрее во многих сценариях. Но это уже не так, если вы используете текущую версию MySQL.

Могут быть некоторые экзотические угловые случаи, когда MyISAM работает немного лучше для определенных рабочих нагрузок (например, сканирование таблиц или работа с большим объемом INSERT), но выбор по умолчанию должен быть InnoDB, если вы не можете доказать, что у вас есть случай, MyISAM работает лучше.

Преимущества InnoDB помимо поддержки транзакций и внешних ключей, которые обычно упоминаются, включают:

  • InnoDB более устойчив к повреждению таблиц, чем MyISAM.
  • Блокировка уровня строки. В MyISAM читатели блокируют авторов и наоборот.
  • Поддержка большого пула буферов для данных и индексов. Буфер ключей MyISAM предназначен только для индексов.
  • MyISAM застаивается; все будущие разработки будут в InnoDB.

См. также мой ответ на MyISAM и InnoDB

Ответ 2

MyISAM не позволит вам выполнить проверку уровня mysql. Например, если вы хотите обновить imgId в обеих таблицах как одну транзакцию:

START TRANSACTION;
UPDATE primary_images SET imgId=2 WHERE imgId=1;
UPDATE secondary_images SET imgId=2 WHERE imgId=1;
COMMIT;

Еще один недостаток - проверка целостности, с помощью InnoDB вы можете выполнить некоторую проверку ошибок, чтобы избежать дублирования значений в поле UNIQUE KEY imgDate (imgDate). Поверьте мне, это действительно под рукой и менее подвержено ошибкам. По моему мнению, MyISAM предназначен для игры, в то время как более серьезная работа должна полагаться на InnoDB.

Надеюсь, что это поможет

Ответ 3

Несколько вещей, которые следует учитывать:

  • Вам нужна поддержка транзакций?
  • Будете ли вы использовать внешние ключи?
  • Будет ли много записей на столе?

Если ответ на любой из этих вопросов "да", то вы обязательно должны использовать InnoDB. В противном случае вы должны ответить на следующие вопросы:

  • Насколько велики ваши таблицы?
  • Сколько строк они содержат?
  • Какова нагрузка на ваш движок базы данных?
  • Какие запросы вы ожидаете запустить?

Если ваши таблицы не очень большие, и вы ожидаете большой нагрузки на свою базу данных, один из них отлично работает.

Я бы предпочел MyISAM, потому что он очень хорошо масштабируется для широкого диапазона размеров и нагрузок данных.

Ответ 4

Я хотел бы добавить что-то, что люди могут извлечь из этого: Я только что создал таблицу InnoDB (оставив все по умолчанию, кроме изменения сортировки в Юникоде) и заполнил ее примерно 300 000 записей (строк).

Запросы типа SELECT COUNT(id) FROM table - будут висеть до появления сообщения об ошибке, не возвращая результата;

Я клонировал таблицу с данными в новую таблицу MyISAM - и тот же запрос, наряду с другими большими запросами SELECT, вернется быстро, и все работает нормально.