SQL: идеальный тип движка (MyISAM vs InnoDB) и тип данных для уникального текстового столбца - PullRequest
0 голосов
/ 13 мая 2011

Привет! У меня есть php-сайт, использующий mysql, и у меня есть таблица со столбцом под названием «Имя». Я намерен иметь следующие функции:

  • Это должен быть тип varchar (N), как и обычные имена.
  • Может быть длинным, но никогда не должно содержать так называемых «описаний», так как это находится в другом поле, которое мне не нужно искать. (возможно, в будущем, которое я мог бы просто положить в другую таблицу)
  • Он ДОЛЖЕН быть уникальным и доступным для поиска, что делает его подходящим кандидатом в качестве первичного ключа.
  • Поиск - это простой тип, который подойдет только для поведения, подобного ключевому слову mysql LIKE%.
  • Эта таблица (очень) часто читается, новые строки вставляются время от времени, строки удаляются / обновляются очень редко.
  • Многие другие таблицы ссылаются на значения в этой таблице, в идеале я хочу иметь ограничения внешнего ключа для других таблиц, что приводит меня к желанию использовать InnoDB.

У меня вопрос: использовать ли MyISAM или InnoDB для этой таблицы? Также можно ли использовать мой не очень длинный varchar в качестве первичного ключа, учитывая частоту чтения / объем используемой памяти / количество предупреждений в Интернете о первичных ключах varchar?

Но я бы действительно хотел извлечь выгоду из ограничений внешнего ключа, которые предлагает InnoDB, или я должен просто беспокоиться об этом на уровне php?

В частности, меня беспокоит возможность полнотекстового поиска в MyISAM. Я пытался прочитать официальные веб-страницы mysql, чтобы понять, для чего это нужно, но не смог понять достаточно, чтобы судить, будет ли от этого полезна моя ситуация.

1 Ответ

1 голос
/ 13 мая 2011

Краткий ответ: InnoDB с суррогатным первичным ключом.

Более длинный ответ

Поскольку предполагается, что в таблице со столбцом Name будет много дочерних таблиц, я бы порекомендовал суррогатный ключ, используя INT UNSIGNED (или даже BIGINT UNSIGNED, если ваши данные этого требуют). Таким образом, все ваши дочерние таблицы не обязательно должны иметь столбец Name, что экономит место.

В InnoDB короткие первичные ключи являются наилучшим вариантом, поскольку первичный ключ включен во все вторичные индексы: http://dev.mysql.com/doc/refman/5.1/en/innodb-index-types.html

FULLTEXT индексы не требуются для простого LIKE('%keyword%') сопоставления. Они помогают, если вы заинтересованы в сопоставлении на естественном языке, которое вы не указали в качестве требования.

...