Нужны лучшие рекомендации по созданию таблиц и использованию текстового первичного ключа - PullRequest
1 голос
/ 22 апреля 2011

Я создаю MySQL MyISAM (нужен полный текстовый поиск).

  1. column_1 - содержит первичный ключ TEXT (данные будут 64-битной кодированной строкой)
  2. column_2 - ссылается на другую таблицу и используется для объединений
  3. column_3 - еще один столбец TEXT, проиндексированный для поиска с использованием MATCH
  4. ...

Таблица может содержать миллиарды записей с течением времени.

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

SELECT * FROM table WHERE column_1 = 123;

Столбец_2 основного поиска будет выполняться следующим образом:

SELECT * FROM table_1 
JOIN table_2 ON ( table_1.column_2 == table_2.id );

column_3 основной поиск будет выполняться следующим образом:

SELECT column_3, MATCH ( column_3 )
AGAINST ( 'TOKEN' ) AS score
FROM table_1;

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

Заранее спасибо.

P.S

Правильно ли я считаю, что если вы выполните поиск, например,

SELECT * FROM table WHERE id = 1; (where id column is not indexed)

Поиск на существенной базе данных будет медленнее, чем если бы столбец был проиндексирован?

1 Ответ

2 голосов
/ 22 апреля 2011
  1. Вам не нужно больше индексов для первого запроса, так как PRIMARY KEY уже проиндексирован.
  2. table_2.id должен быть проиндексирован (если текстовое поле, сделать индексированными первые несколько байтов поля). Таблица_1.column_2 не нуждается в индексации, поскольку вы не делаете выбор в этом поле.
  3. column_3 нуждается в индексе FULL TEXT.

Вы правы в своем последнем предположении. Индекс состоит из структуры данных, специально предназначенной для поиска, со столбцом в качестве ключа и указателем на правильную строку в качестве значения. Поиск по неиндексированному полю потребует полного сканирования таблицы (чтобы БД проверяла каждую строку таблицы).

...