Должен ли я использовать MyISAM или таблицы InnoDB для моей базы данных MySQL? - PullRequest
11 голосов
/ 21 сентября 2011

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

Таблица 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 используется для упорядочивания результатов.

И последнее, но не менее важное: я должен отметить, что эта база данных READ ONLY . Все данные будут введены мной. Мне сказали, что если база данных предназначена только для чтения, это должна быть MyISAM, но я надеюсь, что вы сможете пролить свет на то, что вы сделаете в моей ситуации.

Ответы [ 4 ]

22 голосов
/ 21 сентября 2011

Всегда используйте 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

4 голосов
/ 21 сентября 2011

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.

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

2 голосов
/ 21 сентября 2011

Несколько вещей для рассмотрения:

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

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

  1. Насколько велики ваши таблицы?
  2. Сколько строк в них содержится?
  3. Какова нагрузка на вашу базу данных?engine?
  4. Какие запросы вы ожидаете выполнить?

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

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

0 голосов
/ 31 мая 2017

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

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

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

...