Полнотекстовый поиск в innodb с использованием таблицы slave / ghost myisam - PullRequest
2 голосов
/ 23 июня 2011

Мне нужно выполнить полнотекстовое индексирование для двух разных столбцов в двух разных таблицах.

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

Я знаю, что есть такие параметры, как sphinx, и я посмотрел на них, но мне кажется, что это излишнее, потому что столбцы для полнотекстовой индексации varchar (20).

И, вероятно, будет не более 1 000 000 строк "максимум"

Один простой вариант, я думаю, состоит в том, чтобы дублировать две таблицы только с первичным ключом и varchar, которые будут проиндексированы с использованием myisam.

есть предложения?Есть ли способ достичь этого легко?

Ответы [ 2 ]

1 голос
/ 23 июня 2011

Ваш подход кажется правильным.

  • создайте новую таблицу только с интересующими областями (pkey (s) и varchar (s) интереса), механизм myisam.

  • при необходимости создайте полнотекстовый индекс для этой новой таблицы.

Основная задача состоит в том, чтобы синхронизировать эту новую таблицу с главной таблицей.,Лучший способ сделать это - использовать триггеры при вставке, обновлении и удалении главной таблицы.

Дополнительный поворот - предотвращение вмешательства конечных пользователей в полнотекстовую индексированную таблицу,Это можно сделать и с помощью триггеров, но есть и лучший способ: создать пользователя БД (например, tg_user) и предоставить ему право владения этой таблицей.Затем отмените все, кроме выбора для других пользователей.И убедитесь, что вы используете предложение definer при создании вышеупомянутых триггеров.

0 голосов
/ 24 июня 2011

Я решил пойти с простым решением:

Сначала вставьте строку в таблицу innodb (master).Затем, сразу после него, вставьте строку в таблицу myisam (не триггер).

Запускайте cron каждый час или около того, чтобы обеспечить ссылочную целостность.

Запрос будет выглядеть примерно так:

SELECT * 
FROM master 
WHERE master.ID NOT IN 
    (SELECT slave.ID FROM slave WHERE master.ID=slave.ID);

SELECT * 
FROM slave 
WHERE slave.ID NOT IN 
    (SELECT master.ID FROM master WHERE slave.ID=master.ID);

Если подчиненная строка ссылается на несуществующую главную строку, удалите.

Если подчиненная строка не существует для главной строки, вставьте.

Это не лучшее решение, но простое.

...