簡體   English   中英

MySQL存儲引擎的困境

[英]MySQL storage engine dilemma

我想在我的應用程序中使用兩個MySQL數據庫功能。 第一個是FULL-TEXT-SEARCH和TRANSACTIONS。

現在,這里的困境是我無法在一個存儲引擎中獲得此功能。 它要么我使用MyIsam(具有FULL-TEXT-SEARCH功能),要么使用InnoDB(支持TRANSACTION功能)。 我不能兼得。

我的問題是,無論如何,在我被迫在兩個存儲引擎之間做出選擇之前,我可以在我的應用程序中同時擁有這兩個功能。

可能的解決方法:

  1. 使用Sphinx或Solr或其他一些外部文本搜索引擎進行文本搜索並使用InnoDB引擎。

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

  3. 使用兩個引擎,MyISAM和InnoDB。 保留要在MyISAM中進行全文搜索的列,其余的在InnoDB中。 這將是有風險的,因為MyISAM中的數據不是交易安全的。

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

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

  6. (選項4)但是使用具有“崩潰安全”(但仍然不是事務安全)全文索引的MariaDB(一個MySQL分支): 什么時候將要事務全文本索引准備好?

  7. 使用其他RDBMS,如PostgreSQL,它在事務引擎中具有全文支持。

如果您需要對MySQL中的單個表執行事務和全文,您有幾個選擇。 但實際上,從整個討論中拿走的重點是數據庫不擅長開始全文搜索(特別是MySQL!),理想情況下你想將這項工作卸載到一個更好地執行這種類型的組件上任務。

選項1:

創建一個表,您需要作為InnoDB進行事務處理,然后創建另一個MyisAM“鏡像”表,您可以對其進行全文搜索。 您可以通過使用InnoDB表上的觸發器使數據保持同步。 一個黑客,但它會工作。

選項3:

看看像SphinxLuceneSolr這樣的第三方全文引擎。 這樣,您可以專注於將數據庫設計為查詢數據時的最佳狀態,而不是強制它進行文本搜索。

選項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 implmentation,它支持同一個引擎。 Postgres例如。

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

另一種選擇是使用MySQL對復制的支持:

例如,您可以使用InnoDB存儲引擎設置主服務器。 然后使用MyISAM存儲引擎復制到另一個只讀服務器。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM