2013-01-15 41 views
7

Tôi có một cơ sở dữ liệu MySQL (phiên bản 5.5.28) với một bảng như thế này:Tìm kiếm toàn văn với InnoDB trong MySQL

products (InnoDB) 
------------------------------------------------- 
search_id  title    description 
1    Levi Blue Jeans  Some cool jeans 
2    Gucci Handbag  Great accessory 
3    Prada Dress   Beautiful dress 

tôi muốn làm một cái gì đó như thế này trong MySQL:

SELECT MATCH(title) AGAINST ('Jeans') AS score, search_id, FROM search WHERE MATCH(title) AGAINST ('Jeans' IN BOOLEAN MODE) 

Theo tôi biết bạn chỉ có thể làm điều đó trong MyISAM. Là nó có thể thực hiện tìm kiếm tương tự với InnoDB mà không cần đến những thứ như:

Đối với ứng dụng của tôi (khoảng 1.000-2.000 hồ sơ) Sphinx, vv có vẻ như quá mức cần thiết. Nhưng nhận được mọi bản ghi vào một mảng và tìm kiếm thông qua nó với PHP cũng có vẻ quá nhiều. Nhưng có thể bạn không đồng ý.

PS. LIKE dường như không hoạt động tốt cho tôi. Kết quả thường ít chính xác hơn và bạn không thể đạt được điểm số như bạn có thể với MATCH.

+0

Có vẻ như MySQL 6 sẽ hỗ trợ một số tính năng [fulltext] (http://www.drdobbs.com/database/full-text-search-with-innodb/231902587), nhưng bạn có thể phải sử dụng một thứ khác trong thời gian chờ đợi. – jakerella

Trả lời

13

Sao chép cột văn bản từ products sang bảng MyISAM mới. Thiết lập mối quan hệ 1-1 giữa hai và, để đảm bảo ACID được cung cấp bởi InnoDB, hãy đảm bảo rằng bạn luôn truy cập vào bảng MyISAM cùng với products.

Bạn có thể muốn thêm trình kích hoạt trên products để duy trì việc đánh dấu. Bạn cũng có thể tạo một khung nhìn để việc làm lại là tối thiểu trong ứng dụng của bạn khi bạn nâng cấp lên MySQL v5.6 (và thả cách giải quyết phức tạp này).

Đây là the full monty.

Thay vì sao chép cột văn bản, bạn có thể di chuyển hoàn toàn (xóa từ products, tức là). Điều này sẽ hiệu quả hơn, nhưng nó cũng sẽ làm cho nó phức tạp hơn một chút khi chuyển sang giải pháp chỉ có InnoDB khi bạn muốn nâng cấp.

+0

Ví dụ về SQL Fiddle đẹp. – Wolf

+0

giải pháp siêu dễ dàng cho một câu hỏi phức tạp. hoạt động như một sự quyến rũ. :) – kishu27

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