Дилемма двигателя хранения MySQL

Есть две возможности базы данных MySQL, которые я хочу использовать в своем приложении. Первый – ПОЛНЫЙ-ТЕКСТ-ПОИСК и ОПЕРАЦИИ.

Теперь дилемма заключается в том, что я не могу получить эту функцию в одном хранилище. Я либо использую MyIsam (у которого есть функция FULL-TEXT-SEARCH), либо я использую InnoDB (который поддерживает функцию TRANSACTION). У меня не может быть обоих.

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

Возможные обходные пути:

  1. Используйте Sphinx или Solr или другую внешнюю текстовую поисковую систему для поиска текста и использования движка InnoDB.

  2. Напишите свой собственный код – и используйте InnoDB. На самом деле это не вариант, если вы не нуждаетесь в поиске, ограничены или ваш бюджет огромен.

  3. Используйте оба двигателя, MyISAM и InnoDB. Сохраните столбцы, которые вы хотите использовать для полнотекстового поиска в MyISAM, а остальные в InnoDB. Это будет опасно, так как данные в MyISAM не будут безопасными для транзакций.

  4. Используйте оба двигателя, MyISAM и InnoDB. Храните все данные в InnoDB и дублируйте столбцы, которые вы хотите использовать для полнотекстового поиска в MyISAM. Для этого потребуется некоторый механизм (триггеры) для дублирования данных.

  5. Дождитесь версии MySQL, где полнотекстовый поиск будет поддерживаться InnoDB или другим механизмом транзакций.

  6. (Вариант 4), но используйте MariaDB (MySQL fork), который имеет полнофункциональные текстовые индексы с «аварийным» (но все же небезопасным): когда-во-транзакции-полнотекстовые-индексы будут готовы?

  7. Используйте другие СУБД, такие как PostgreSQL, которые имеют полнотекстовую поддержку в транзакционном движке.

Если вам необходимо выполнить транзакции и полнотекстовый текст в отношении одной таблицы в MySQL, у вас есть несколько вариантов. Но на самом деле основным моментом, который следует отвлечь от всего этого обсуждения, является то, что базы данных не очень хорошо выполняют полнотекстовый поиск (особенно MySQL!), И в идеале вы хотите разгрузить эту работу компоненту, который лучше выполняет этот тип задачи.

Опция 1:

Создайте одну таблицу, в которой вам нужно выполнить транзакцию как InnoDB, а затем создайте другую «зеркальную» таблицу, которая является MyISAM, с которой вы можете выполнять полнотекстовый поиск. Вы можете синхронизировать данные с помощью триггера в таблице InnoDB. Вид взлома, но он будет работать.

Вариант 3:

Взгляните на сторонний полнотекстовый движок, такой как Sphinx , Lucene или Solr . Таким образом, вы можете сосредоточиться на разработке своей базы данных, чтобы быть оптимальной при запросе данных, а не принуждать ее выполнять текстовый поиск.

Вариант 3:

Вы можете выбрать другой сервер базы данных, поддерживающий транзакции и полнотекстовый поиск в одно и то же время, например SQL Server.

Надеюсь, это даст вам некоторую ясность.

Наслаждайтесь!

Полнотекстовый индекс MyISAM, вероятно, не так хорош, как вы думаете. Он работает нормально (ish) на небольших данных, но на больших данных он отвратителен.

В MySQL 5.6 мы можем иметь полнотекстовый текст на InnoDB, однако он по-прежнему не поддерживает большинство функций, которые могут иметь реальные полнотекстовые поисковые системы.

нет никакого способа иметь как в одном и том же движке базы данных, это ограничения, которые дает дизайн, как работает MySQL. Вы не можете изменить физику. 😉

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html
http://dev.mysql.com/doc/refman/5.1/en/ansi-diff-transactions.html

когда вы все еще находитесь в стадии проектирования, вы также можете рассмотреть возможность использования другого приложения SQL для своего проекта, который поддерживает как в одном движке. Например, Postgres.

http://wiki.postgresql.org/wiki/Why_PostgreSQL_Instead_of_MySQL_2009#Transactions_and_the_Database_Engine_Core

Другим вариантом является использование поддержки MySQL для репликации:

Например, вы можете настроить главный сервер с помощью механизма хранения InnoDB. Затем реплицируйте на другой сервер только для чтения с механизмом хранения MyISAM.

Вы можете использовать почти любой механизм хранения MySQL, и, возможно, некоторые из них поддерживают лучшие функции поиска, чем MyISAM для некоторых случаев использования.