2011-11-25 35 views
7

Có hai tính năng cơ sở dữ liệu MySQL mà tôi muốn sử dụng trong ứng dụng của mình. Đầu tiên là FULL-TEXT-SEARCH và TRANSACTIONS.Tình trạng khó xử của công cụ lưu trữ MySQL

Bây giờ, tình trạng tiến thoái lưỡng nan ở đây là tôi không thể có được tính năng này trong một công cụ lưu trữ. Đó là hoặc là tôi sử dụng MyIsam (trong đó có tính năng FULL-TEXT-SEARCH) hoặc tôi sử dụng InnoDB (hỗ trợ tính năng TRANSACTION). Tôi không thể có cả hai.

Câu hỏi của tôi là, có anyway tôi có thể có cả hai tính năng trong ứng dụng của tôi trước khi tôi buộc phải thực hiện một sự lựa chọn giữa hai công cụ lưu trữ.

+1

Bạn có thể sử dụng một cái gì đó như [Sphinx] (http://sphinxsearch.com/) hoặc [Solr] (http://lucene.apache.org/solr/) để lập chỉ mục và tìm kiếm bất kỳ cơ sở dữ liệu MySQL nào. Sau đó bạn có thể sử dụng InnoDB. –

+0

OK. Đó là điều đúng đắn. Tôi đoán rằng wud là lựa chọn duy nhất của tôi. Cảm ơn bạn đã trả lời nhanh – burntblark

+0

chỉ cần sử dụng innodb. tin tưởng vào bộ nhớ cache thực hiện hầu hết công việc, bạn sẽ không cần tìm kiếm toàn văn. –

Trả lời

10

cách giải quyết có thể:

  1. Sử dụng Sphinx hay Solr hoặc một số công cụ tìm kiếm văn bản bên ngoài khác để tìm kiếm văn bản của bạn và sử dụng động cơ InnoDB.

  2. Viết mã tìm kiếm của riêng bạn - và sử dụng InnoDB. Đây không thực sự là một lựa chọn, trừ khi bạn tìm kiếm nhu cầu bị hạn chế hoặc ngân sách của bạn là rất lớn.

  3. Sử dụng cả hai công cụ, MyISAM và InnoDB. Giữ các cột bạn muốn tìm kiếm toàn văn trong MyISAM và các cột còn lại trong InnoDB. Điều này sẽ rất rủi ro vì dữ liệu trong MyISAM sẽ không được giao dịch an toàn.

  4. Sử dụng cả hai công cụ, MyISAM và InnoDB. Giữ tất cả dữ liệu trong InnoDB và sao chép các cột bạn muốn tìm kiếm toàn văn trong MyISAM. Điều này sẽ cần một số cơ chế (kích hoạt) để sao chép dữ liệu.

  5. Đợi phiên bản MySQL nơi tìm kiếm toàn văn bản sẽ được hỗ trợ bởi InnoDB hoặc công cụ giao dịch khác.

  6. (Option 4) nhưng sử dụng MariaDB (nĩa MySQL) trong đó có đầy đủ chỉ mục văn bản "tai nạn an toàn" (nhưng vẫn không giao dịch an toàn): When-will-transactional-fulltext-indexes-be-ready?

  7. Sử dụng RDBMS khác như PostgreSQL có đầy đủ -text hỗ trợ trong công cụ giao dịch.

+1

+1 Tổng quan đẹp. Tôi đã thành công với tùy chọn 4 trong trường hợp yêu cầu fulltext được bản địa hóa thành một vài cột. – grossvogel

+0

+1, btw, tùy chọn 5 có dự kiến ​​ngày hay bạn chỉ đang suy đoán? – Drew

+1

@AndrewHeath: Không, tôi không có ý tưởng về một ngày dự kiến. Bạn có thể hỏi tại diễn đàn MySQL (InnoDB) hoặc tại diễn đàn MariaDB. –

2

không có cách nào để có cả hai trong cùng một cơ sở dữ liệu, đây là những ràng buộc được đưa ra bởi thiết kế cách thức hoạt động của MySQL. Bạn không thể thay đổi vật lý. ;-)

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

khi bạn vẫn đang trong giai đoạn thiết kế, bạn cũng có thể xem xét sử dụng một implmentation SQL cho dự án của bạn có hỗ trợ cả trong công cụ tương tự. Postgres chẳng hạn.

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

+1

Cảm ơn Kaii ... Postgre ở đây tôi đến :). – burntblark

+1

Bạn không chắc chắn điều này liên quan đến vật lý, nhưng đây là một neutrino nhanh hơn ánh sáng cho bạn: http://blogs.innodb.com/wp/2011/07/innodb-fts-performance/ –

+0

@Michael: xin lỗi , quên cười bên cạnh "vật lý". tôi đã sửa nó. tốt đẹp để đọc innodb sớm hỗ trợ toàn văn, nhưng chúng tôi vẫn phải đợi cho đến khi điều này có sẵn trong các gói mysql của các bản phân phối chính. – Kaii

5

Nếu bạn cần phải thực hiện các giao dịch và toàn văn chống lại một bảng duy nhất trong MySQL, bạn có một vài lựa chọn. Nhưng thực sự điểm nổi bật để lấy đi từ toàn bộ cuộc thảo luận này là cơ sở dữ liệu không giỏi trong việc tìm kiếm toàn văn bản để bắt đầu (đặc biệt là MySQL!) Và lý tưởng là bạn muốn giảm tải công việc này thành một thành phần tốt hơn khi thực hiện loại này nhiệm vụ.

Lựa chọn 1:

Tạo một bảng mà bạn cần phải thực hiện giao dịch chống lại như InnoDB và sau đó tạo ra một "gương" bảng đó là MyISAM mà bạn có thể tìm kiếm toàn văn chống lại. Bạn có thể giữ cho dữ liệu đồng bộ thông qua việc sử dụng trình kích hoạt trên bảng InnoDB. Loại hack nhưng nó sẽ hoạt động.

Lựa chọn 3:

Hãy nhìn vào một động cơ toàn văn bên thứ 3 như Sphinx, Lucene hoặc Solr. Bằng cách này, bạn có thể tập trung vào việc thiết kế cơ sở dữ liệu của mình để tối ưu hóa việc truy vấn dữ liệu và không buộc phải thực hiện tìm kiếm văn bản.

Lựa chọn 3:

Bạn có thể chọn để đi với một máy chủ cơ sở dữ liệu khác nhau có hỗ trợ giao dịch và tìm kiếm văn bản đầy đủ cùng một lúc, chẳng hạn như SQL Server.

Hy vọng điều này sẽ giúp bạn hiểu rõ hơn.

Tận hưởng!

+1

sử dụng công cụ tìm kiếm trái ngược với chỉ mục toàn văn là hoàn toàn các cách tiếp cận khác nhau - cả hai đều có lợi ích và hạn chế của chúng. đọc trên đây cho một so sánh tốt đẹp của Lucene vs MySQL toàn văn .. có thể phù hợp tốt trên công cụ tìm kiếm khác so với các công cụ cơ sở dữ liệu khác: http://jayant7k.blogspot.com/2006/05/mysql-fulltext-search- versus-lucene.html – Kaii

3

Chỉ mục toàn văn MyISAM có thể không tốt như bạn nghĩ. Nó hoạt động ok (ish) trên dữ liệu nhỏ, nhưng tệ hại trên dữ liệu lớn hơn.

Trong MySQL 5.6, chúng tôi có thể có toàn văn trên InnoDB, tuy nhiên nó vẫn không hỗ trợ hầu hết các tính năng mà một công cụ tìm kiếm toàn văn bản thực sự có.

1

Một tùy chọn khác là sử dụng hỗ trợ của MySQL để sao chép:

Ví dụ: bạn có thể thiết lập máy chủ chính với công cụ lưu trữ InnoDB. Sau đó sao chép sang một máy chủ chỉ đọc khác với công cụ lưu trữ MyISAM.

Bạn có thể sử dụng hầu như bất kỳ công cụ lưu trữ MySQL nào và có thể có một số công cụ hỗ trợ các tính năng tìm kiếm tốt hơn MyISAM đối với một số trường hợp sử dụng.

Các vấn đề liên quan