2010-04-14 42 views
15

Tôi đang thiết kế một ứng dụng web nội bộ sử dụng MySQL làm cơ sở dữ liệu phụ trợ của nó. Tính toàn vẹn của dữ liệu là rất quan trọng, vì vậy tôi đang sử dụng công cụ innoDB cho các tính năng ràng buộc khóa ngoài của nó.Tìm kiếm toàn văn MySQL Workaround cho các bảng innoDB

Tôi muốn thực hiện tìm kiếm toàn văn của một loại bản ghi và không được hỗ trợ nguyên bản với bảng innoDB. Tôi không sẵn sàng chuyển sang MyISAM bảng do thiếu hỗ trợ khóa ngoài và do thực tế là khóa của họ là trên mỗi bảng chứ không phải mỗi hàng. Có phải là thực tế không tốt để tạo một bảng được ghi lại các bản ghi mà tôi cần phải tìm kiếm bằng cách sử dụng công cụ MyISAM và sử dụng nó cho tìm kiếm toàn văn bản không? Không. Bằng cách này, tôi chỉ đang tìm kiếm một bản sao của dữ liệu và nếu bất cứ điều gì xảy ra với dữ liệu đó thì nó không lớn bằng một thỏa thuận vì nó luôn có thể được tạo lại.

Hoặc đây có phải là một cách khó xử khi thực hiện việc này cần tránh không?

Cảm ơn.

+0

Có một khá tốt chạy xuống các lựa chọn từ Percona: http://www.mysqlperformanceblog.com/2009/09/10/what-to-do-with-mysql-full-text- tìm kiếm trong khi di chuyển-tới-innodb/ – cce

Trả lời

7

Tôi nghĩ nó thực sự khó xử. Điều đó nói rằng, tôi "nguyên mẫu nhanh chóng mà có thể sẽ vô tình trở thành mã sản xuất" phương pháp để làm điều này là một cái gì đó như thế này:

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; 

Và cho điểm thưởng bạn có thể làm tất cả điều đó bên trong một giao dịch nên có phù hợp với ưa thích của bạn (tiền thưởng tăng gấp đôi nếu bạn đang sử dụng các kết nối không liên tục và chỉ tìm kiếm một lần cho mỗi kết nối, vì bạn có thể loại bỏ tuyên bố thả).

Có, tôi nhận ra rằng điều này không thực sự phản ánh/sao chép. Có, tôi nhận ra rằng việc xếp bảng có thể tốn kém (các bộ dữ liệu tương đối nhỏ ở đây). Như tôi đã nói, nguyên mẫu nhanh và bẩn. YMMV

+4

Đồng ý. Nó thực sự khó xử. – Abinadi

+0

Chỉ có điều tốt hơn mã là hãy cẩn thận. : P –

+0

Làm cách nào để tạo lại toàn bộ chỉ mục trên mọi truy vấn có thể tốt hơn tìm kiếm với 'LIKE'? –

2

Bạn có thể tạo bảng phản chiếu. Điều đó có lẽ ít hơn lý tưởng, vì bảng MyISAM sẽ không tôn trọng các giao dịch của bạn (nếu một giao dịch thất bại trên InnoDB, những thay đổi của bạn được thực hiện cho MyISAM trong giao dịch đó vẫn sẽ xuất hiện).

Bạn có thể sử dụng một hệ thống tìm kiếm toàn văn chuyên dụng như Sphinx, đó là những gì tôi đã sử dụng để tìm kiếm toàn văn (Kể từ cơ sở dữ liệu của tôi là InnoDB).

9

Bạn có thể thực hiện một số loại đồng bộ hóa dữ liệu bằng trình kích hoạt (nếu phiên bản mysql của bạn hỗ trợ chúng). Chúng cho phép bạn chạy các đoạn mã SQL nhỏ tại một số điểm nhất định như sau khi dữ liệu được chèn vào hoặc xóa khỏi bảng.

Ví dụ ...

create trigger TRIGGER_NAME after insert on INNODB_TABLE 
insert into MYISAM_TABLE select * from INNODB_TABLE 
where id = last_insert_id(); 

... Bất cứ khi nào dữ liệu được chèn vào bảng InnoDB, cùng một dữ liệu được tự động chèn vào bảng MyISAM.

+0

giải pháp này có hoạt động với jdbc và mysql 5.1 không? – Noona

+0

có trình kích hoạt được hỗ trợ trong 5.1 – michael

+0

@Noona JDBC không có liên kết với trình kích hoạt phía cơ sở dữ liệu theo như tôi biết. Để michael giải pháp của bạn là khá bẩn như cái nhìn đầu tiên nhưng khá hiệu quả (nó sẽ không reinsert tất cả các dữ liệu sau mỗi chèn?) – AsTeR

1

Tôi cảm thấy rằng giải pháp đơn giản nhất cho vấn đề này là tạo bảng chỉ mục sẽ được sử dụng cho các tìm kiếm, với con trỏ trở lại bảng chứa dữ liệu thực. Tôi đang phải đối mặt chính xác cùng một vấn đề và tôi không muốn sử dụng các bảng MyISAM cho hệ thống của tôi vì sự an tâm của các bảng InnoDB.

Vì vậy, những gì tôi định làm với vấn đề của mình là tạo bảng chỉ mục bằng MyISAM, vì vậy tôi chỉ có thể có thông tin được lập chỉ mục trên đó. Quá trình đồng bộ hóa sẽ được thực hiện bằng trình kích hoạt, đây là cách đơn giản nhất để thực hiện việc này. Tôi không muốn sao chép toàn bộ bảng, vì nó sẽ tốn rất nhiều không gian. Tuy nhiên, việc sao chép chỉ các trường mong muốn sẽ làm mất không gian với chi phí của cơ sở công cụ tìm kiếm.

Bảng chỉ mục này có thể được hiểu là chỉ mục cho các cơ sở tìm kiếm. Như bất kỳ chỉ mục nào, nó sẽ mất không gian. Là một tối ưu hóa, dữ liệu được chèn vào bảng chỉ mục này chỉ có thể là các thuật ngữ, nhưng cách xử lý bổ sung này là cần thiết để làm sạch từ vô dụng để tìm kiếm.

1

Tin vui! Trong MySQL 5.6 trở lên, các chỉ mục toàn văn có thể được sử dụng với các bảng InnoDB. Bạn nên xem xét cập nhật MySQL của bạn lên 5,6 hoặc lên nếu bạn chưa làm như vậy.

Với ứng dụng tìm kiếm toàn văn của tôi rất quan trọng nên tôi vừa mới sử dụng MyISAM. Bây giờ, tôi đã cập nhật MySQL thành 5.6, chuyển đổi cơ sở dữ liệu thành InnoDB và thêm vào các ràng buộc chính xác. Tốt nhất của thế giới bận tâm.

MySQL 5.6 Manual - Full-Text Search Functions

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