Это правильный способ индексировать столбец TEXT базы данных MySQL? - PullRequest
9 голосов
/ 16 февраля 2010

У меня есть карта от строк до целых чисел. Чтобы сохранить эту карту в базе данных MySQL, я создал следующую таблицу:

CREATE TABLE map(
  Argument TEXT NOT NULL,
  Image INTEGER NOT NULL
)

Я выбрал тип TEXT для аргумента, потому что его длина непредсказуема, в настоящее время самая длинная запись имеет 2290 символов, а средняя длина составляет 88 символов.

После того, как я столкнулся с проблемами производительности, я попытался добавить индекс для столбца Argument, но обнаружил, что должен указать длину, поэтому, чтобы избежать этого ограничения, я добавил новый целочисленный столбец, содержащий значения хеша (md5 или другое) значений столбца аргумента.

ALTER TABLE map ADD COLUMN ArgumentHash INTEGER;

И комбинированный индекс

CREATE INDEX argument_index USING HASH ON map(ArgumentHash, Argument(80));

С тех пор проблемы с производительностью исчезли. Я хотел бы спросить, является ли это правильным способом решения этой проблемы.

1 Ответ

3 голосов
/ 16 февраля 2010

Я не думаю, что есть "правильный" способ, это зависит от того, для чего вы используете столбец.

По моему опыту, необычно иметь / хотеть выделить большой текстовый столбец; текст обычно представляет собой данные, полученные другим ключом (если не проиндексированы каким-либо другим способом - например, полным текстом, Lucene - но это не похоже на то, что вы делаете)

Если вам действительно нужно точное совпадение для большого поля, тогда может быть более эффективно использовать хеш, поскольку он, вероятно, позволит вам уменьшить индекс. Я предполагаю, что если вам нужно использовать размер индекса, превышающий размер хеша (зависит от того, насколько близко к началу TEXT значения обычно различаются), используйте хеш.

Лучше всего попробовать и посмотреть. Профилируйте оба подхода с репрезентативными данными и узнайте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...