Я разрабатываю внутреннее веб-приложение, которое использует MySQL в качестве его базы данных бэкенда. Целостность данных крайне важна, таким образом, я использую innoDB
механизм для его ограничительных функций внешнего ключа.
Я хочу сделать полнотекстовый поиск одного типа записей, и это не поддерживается исходно с innoDB таблицами. Я не готов переместиться в MyISAM
таблицы из-за их отсутствия поддержки внешнего ключа и вследствие того, что их блокировка на таблицу, не на строку.
Это была бы плохая практика для составления зеркальной таблицы записей, я должен искать использование механизма MyISAM и использования это для полнотекстового поиска? Таким образом, я просто ищу копию данных и если что-нибудь происходит с теми данными, это не является столь же большим из соглашения, потому что это может всегда воссоздаваться.
Или действительно ли это - неловкий способ сделать это, которого нужно избежать?
Спасибо.
Я думаю, что это действительно неудобно. Учитывая это, мой "быстрый прототип, который, вероятно, случайно станет производственным кодом" позволяет сделать это примерно так:
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
Вы можете создать зеркальную таблицу. Это, вероятно, менее идеальный вариант, поскольку таблица MyISAM не будет соблюдать ваши транзакции (если транзакция не прошла на InnoDB, ваши изменения, сделанные в MyISAM в этой транзакции, все равно появятся).
Вы можете использовать специализированную систему полнотекстового поиска, например Sphinx, которую я использовал для полнотекстового поиска (поскольку моя база данных - InnoDB).
Возможно, вы сможете выполнить какую-то синхронизацию данных с помощью триггеров (если ваша версия 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.