2012-02-24 26 views
9

Tôi đang có hàng triệu bản ghi trong cơ sở dữ liệu mysql của mình. Tôi đã triển khai một REST api bình thường cho ứng dụng iPhone trong Rails 3, nhưng phản hồi tính năng SAYT thực sự chậm. Phải mất rất nhiều thời gian để tìm kiếm cơ sở dữ liệu và trả lại kết quả. Làm cách nào để cải thiện hiệu suất?Cách triển khai api Tìm kiếm khi bạn nhập (SAYT) trong ứng dụng Rails 3

Tôi đã lập chỉ mục các bảng của mình. Tôi nên xem xét tất cả các khía cạnh khác như điều chỉnh MySQL, hoặc tôi nên sử dụng sphinx hoặc vết đen mặt trời? Điều đó sẽ giúp tôi với tất cả các lời khuyên của chuyên gia của bạn.

+0

Bạn có thể chia sẻ thêm một chút thông tin không? Bạn đang tìm kiếm bao nhiêu cột? Loại trường nào? Bạn có thể chia sẻ truy vấn bạn đang sử dụng ngay bây giờ không? Bạn chắc chắn nên nhìn vào một công cụ tìm kiếm văn bản đầy đủ, tìm kiếm đàn hồi là một công cụ tốt khác: http://railscasts.com/episodes?search=search – fatfrog

+0

Tốc độ chậm như thế nào? Bạn có thể đăng một ý chính của nhật ký phát triển đường ray cho một yêu cầu tìm kiếm không? Câu trả lời cho câu hỏi của bạn phụ thuộc rất nhiều vào việc liệu thời gian được dành nhiều nhất trong việc truy vấn cơ sở dữ liệu, trả lại kết quả, cả hai, cái gì khác, vv Hồ sơ trước khi thay đổi mọi thứ! – carols10cents

Trả lời

1

Tôi không chắc chắn ý của bạn là gì bằng cách thêm tìm kiếm nhanh hơn nhưng tốt nhất là giới hạn kết quả tìm kiếm của bạn thành 100 khi nó chạm vào khả năng sử dụng. Không nhiều người dùng sẽ trải qua 100 hồ sơ cho tìm kiếm của họ.

Để đạt được tìm kiếm như vậy, tôi khuyên bạn nên bao gồm bảng từ khóa. Bảng từ khóa phải bao gồm id hồ sơ và từ khóa liên quan đến nó và số lần từ khóa đã được giao dịch trong cơ sở dữ liệu.

Do đó, nó sẽ giúp bạn xác định 100 bản ghi hàng đầu và tìm kiếm chính xác nhất.

Có nhiều thuật toán tìm kiếm dưới dạng Bản đồ giảm quá chạy đồng thời. Tôi không nghĩ rằng công nghệ thiết bị di động của bạn có thể xử lý việc giảm bản đồ.

+2

Đối với trang đầu tiên của kết quả trên một thiết bị di động, tôi muốn nói 5-10 kết quả là rất nhiều, thậm chí. – carols10cents

1

Tôi cũng khuyên bạn nên sử dụng công cụ tìm kiếm toàn văn như Nhân sư.

Có một screencast tốt về việc sử dụng Sphinx và đường ray với đá quý thinking_sphinx:

Railscast thinking_sphinx gem

Với viên ngọc mà bạn cũng có thể ảnh hưởng đến kết quả tìm kiếm liên quan đến tầm quan trọng của ví dụ thêm trọng lĩnh vực:

Vì nó là một thiết bị di động i cũng sẽ giữ số tiền của kết quả gửi đến điện thoại di động đến một minmum như Madi allready đề cập đến nó.

Have fun

0

Tùy thuộc vào những gì bạn thực hiện truy vấn, LIKE truy vấn phù hợp vào đầu cột có thể sử dụng chỉ số (trong Postgres Tôi biết chắc chắn rằng họ làm; trong MySQL Tôi không chắc chắn).

Vì vậy,

Widget.where('name LIKE ?', "#{search_term}%").all 

sẽ sử dụng một chỉ số cơ sở dữ liệu (ít nhất là trong Postgres), trong khi

Widget.where('name LIKE ?', "%#{search_term}%").all 

sẽ không. Lưu ý % khi bắt đầu cụm từ tìm kiếm. Số dặm của bạn cũng có thể khác nhau với các điều kiện ILIKE (phân biệt chữ hoa chữ thường), so với điều kiện LIKE (phân biệt chữ hoa chữ thường). Đọc tài liệu cơ sở dữ liệu. Đó có thể là quả treo thấp nhất.

Công cụ tìm kiếm, như được đề xuất bởi câu trả lời khác, là một tùy chọn khác. Nếu bạn được triển khai trên Heroku, có một số tiện ích tìm kiếm trên đám mây khá dễ tích hợp, nhưng có lẽ vẫn còn một thứ tự cường độ lớn hơn là điều chỉnh các truy vấn của bạn một chút.

1

Để tìm kiếm hàng triệu bản ghi nhanh chóng, có thể bạn sẽ muốn sử dụng cấu trúc dữ liệu kiểu trie. http://en.wikipedia.org/wiki/Trie có mã mẫu ruby ​​nếu bạn muốn được trợ giúp.

Đơn giản hóa một chút, trie là phương pháp hiệu quả cao để theo dõi những gì trẻ em thuộc về danh sách ký tự ban đầu.

Về cơ bản, công nghệ SAYT của bạn sẽ lấy một chuỗi và trả về kết quả 15 hoặc cao nhất cho mục nhập của chuỗi cho chuỗi đó.

Tùy thuộc vào cách tự tương tự các hàng của bạn, điều này sẽ ảnh hưởng đến việc sử dụng RAM của bạn, tất nhiên.

0

Bạn có thể tạo một bảng để tìm kiếm nhiều nhất và sau đó ưu tiên tìm kiếm theo cách đó có thể, hy vọng điều này sẽ hữu ích.

2

Tôi đồng ý với câu trả lời chung: sử dụng công cụ tìm kiếm như Sphinx (và giới hạn số lượng kết quả được trả lại); chúng được thiết kế để làm chính xác những gì bạn muốn.

Tuy nhiên, trong khi hàng triệu bản ghi có thể nghe có vẻ như rất nhiều, trước tiên bạn phải xác định những gì mất nhiều thời gian. Tôi có tình yêu lớn dành cho Sphinx và ThinkingSphinx - họ coi đó là một quá trình khá phức tạp và làm cho nó trở nên khá đơn giản và dễ dàng. Nhưng, cuối cùng, một công cụ tìm kiếm là một hệ thống khác để quản lý, cấu hình, tìm hiểu và biết. Nếu bạn không cần phải đến đó, nó sẽ không dễ dàng hơn, đúng không?

Đây có thể là truy vấn, có thể là thời gian để trả lại dữ liệu (limit là bạn của bạn!). Hoặc có thể là bạn đang nhận được hàng trăm yêu cầu mỗi giây, có thể do độ trễ tự động hoàn tất quá ngắn - nếu tra cứu xảy ra ở mọi ký tự, người đánh máy nhanh hoặc nhiều người dùng có thể dễ dàng vượt qua máy chủ bằng truy vấn không cung cấp tiện ích cho người dùng.

Xem nhật ký Rails và xem điều gì đang thực sự xảy ra. Nếu đó là một vấn đề hiệu suất truy vấn đơn giản, thực hiện tìm kiếm văn bản đầy đủ phức tạp, thì, vâng, điều đó sẽ chậm và Sphinx sẽ đáng để nỗ lực. Cơ sở dữ liệu của bạn có một công cụ explain, với một số công việc, có thể giúp bạn hiểu cơ sở dữ liệu đang làm gì để có được kết quả. Nó không phải là không phổ biến mà một chỉ số không được sử dụng.

Điều gì về bộ nhớ đệm? Memcached là một công cụ tuyệt vời. Hoặc thậm chí chỉ cần cài đặt kích thước bộ đệm của bạn cho cơ sở dữ liệu có thể cho phép nó sử dụng nhiều bộ nhớ hơn cho bộ nhớ đệm.

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