MySQL Full-text Search Workaround для innoDB таблиц

Я разрабатываю внутреннее веб-приложение, которое использует MySQL в качестве его базы данных бэкенда. Целостность данных крайне важна, таким образом, я использую innoDB механизм для его ограничительных функций внешнего ключа.

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

Это была бы плохая практика для составления зеркальной таблицы записей, я должен искать использование механизма MyISAM и использования это для полнотекстового поиска? Таким образом, я просто ищу копию данных и если что-нибудь происходит с теми данными, это не является столь же большим из соглашения, потому что это может всегда воссоздаваться.

Или действительно ли это - неловкий способ сделать это, которого нужно избежать?

Спасибо.

15
задан Rob 14 April 2010 в 15:25
поделиться

3 ответа

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

CREATE TEMPORARY TABLE search_mirror (FULLTEXT INDEX (col1, col2, ...)) Engine=MyISAM SELECT * FROM original_innodb_table;

SELECT * FROM search_mirror WHERE MATCH(col1, col2, ...) AGAINST ('foo');

DROP TEMPORARY TABLE search_mirror;

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

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

7
ответ дан 1 December 2019 в 03:34
поделиться

Вы можете создать зеркальную таблицу. Это, вероятно, менее идеальный вариант, поскольку таблица MyISAM не будет соблюдать ваши транзакции (если транзакция не прошла на InnoDB, ваши изменения, сделанные в MyISAM в этой транзакции, все равно появятся).

Вы можете использовать специализированную систему полнотекстового поиска, например Sphinx, которую я использовал для полнотекстового поиска (поскольку моя база данных - InnoDB).

2
ответ дан 1 December 2019 в 03:34
поделиться

Возможно, вы сможете выполнить какую-то синхронизацию данных с помощью триггеров (если ваша версия mysql их поддерживает). Они позволяют запускать небольшие фрагменты SQL в определенные моменты, например, после вставки или удаления данных из таблицы.

Например ...

create trigger TRIGGER_NAME after insert on INNODB_TABLE
insert into MYISAM_TABLE select * from INNODB_TABLE
where id = last_insert_id();

... Каждый раз, когда данные вставляются в таблицу INNODB, те же данные автоматически вставляются в таблицу MYISAM.

10
ответ дан 1 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: