2011-11-25 136 views
7

我想在我的應用程序中使用兩種MySQL數據庫功能。首先是全文搜索和交易。MySQL存儲引擎困境

現在,這裏的困境是我無法在一個存儲引擎中獲得此功能。它要麼使用MyIsam(具有全文搜索功能),要麼我使用InnoDB(它支持TRANSACTION功能)。我不能擁有兩個。

我的問題是,無論如何,我可以在我的應用程序中有兩個功能,然後我不得不在兩個存儲引擎之間進行選擇。

+1

您可以使用[Sphinx](http://sphinxsearch.com/)或[Solr](http://lucene.apache.org/solr/)之類的內容來索引和搜索任何MySQL數據庫。然後你可以使用InnoDB。 –

+0

好的。這是lucene的權利。我猜想,我是唯一的選擇。感謝您的及時回覆 – burntblark

+0

只使用innodb。信任大部分工作的緩存,您不需要全文搜索。 –

回答

10

可能的解決方法:

  1. 使用獅身人面像或Solr的或爲您的文本搜索一些其他的外部文本的搜索引擎,並使用InnoDB引擎。

  2. 編寫您自己的搜索代碼 - 並使用InnoDB。這不是一個真正的選擇,除非你的搜索需求有限或你的預算很大。

  3. 同時使用引擎,MyISAM和InnoDB。保留希望在MyISAM中進行全文搜索的列,其餘部分保存在InnoDB中。這將是有風險的,因爲MyISAM中的數據不會是交易安全的。

  4. 同時使用引擎,MyISAM和InnoDB。將所有數據保留在InnoDB中,並複製要在MyISAM中進行全文搜索的列。這將需要一些機制(觸發器)進行數據重複。

  5. 等待InnoDB或其他事務引擎支持全文搜索的MySQL版本。

  6. (選項4),但使用具有「碰撞安全」​​(但還不是交易安全的)全文索引MariaDB的(一個MySQL叉):When-will-transactional-fulltext-indexes-be-ready?

  7. 使用其他RDBMS一樣,具有完全的PostgreSQL事務引擎中的文本支持。

+1

+1好的概述。在全文需求被本地化爲幾列的情況下,我已經成功使用了選項4。 – grossvogel

+0

+1,順便說一句,沒有選項5有一個預計日期,或者你只是猜測? – Drew

+1

@AndrewHeath:不,我不知道預計日期。您可以在MySQL(InnoDB)論壇或MariaDB論壇上詢問。 –

2

在同一個數據庫引擎中沒有辦法同時存在,這些都是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 implmentation。 Postgres的例子呢。

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

+1

謝謝Kaii ... Postgre在這裏我來:)。 – burntblark

+1

不知道這與物理有什麼關係,但是這裏有一個比光速更快的中微子:http://blogs.innodb.com/wp/2011/07/innodb-fts-performance/ –

+0

@邁克爾:對不起,忘記了「物理」旁邊的笑臉。我修正了這一點。很高興看到innodb很快就會支持全文,但是我們仍然需要等到主要發行版的mysql包中可用。 – Kaii

5

如果您需要執行的交易和全文對MySQL的一個表,你有幾種選擇。但是,從整個討論中脫穎而出的重要一點是,數據庫不擅長以全文搜索開始(特別是MySQL!),理想情況下,您希望將此工作轉移到更適合執行此類型的組件的任務。

選項1:

創建你需要做的交易對InnoDB和再創造另一個「鏡像」表是MyISAM的,你可以做針對全文檢索一個表。您可以通過在InnoDB表上使用觸發器來保持數據同步。一種黑客,但它會工作。

方案3:

在第三方全文引擎看一看像SphinxLuceneSolr。通過這種方式,您可以專注於設計數據庫,以便在查詢數據時達到最佳效果,而不是強制它進行文本搜索。

方案3:

你可以選擇去與支持事務,並在同一時間全文搜索,如SQL Server不同的數據庫服務器。

希望這給你一些清晰。

享受!

+1

使用搜索引擎而不是全文索引是完全的不同的方法 - 都有其優點和缺點。在這裏閱讀一下Lucene與MySQL全文的完美比較......可能適用於其他搜索引擎與其他數據庫引擎:http://jayant7k.blogspot.com/2006/05/mysql-fulltext-search- vs-lucene.html – Kaii

3

MyISAM全文索引可能不如您想象的那麼好。它在小數據上工作正常(ish),但對較大數據很糟糕。

在MySQL 5.6中,我們可能在InnoDB上有全文,但它仍然不支持真正的全文搜索引擎所具有的大多數功能。

1

彼此選擇是使用複製MySQL的支持:

例如,你可以使用InnoDB存儲引擎設置主服務器。然後使用MyISAM存儲引擎複製到另一個只讀服務器。

您幾乎可以使用任何MySQL存儲引擎,並且在某些使用情況下,可能會有一些支持比MyISAM更好的搜索功能。