2011-11-05 38 views
7

Có cách nào có thể mở rộng hàng nghìn hàng bằng cách sử dụng mysql IN hay một cái gì đó tương tự?Cách hiệu quả nhất để chọn hàng nghìn hàng từ danh sách các id

Ví dụ:

SELECT * FROM awesomeTable WHERE id IN (1,2,3,4......100000) 

Điều này có thể hay tôi chỉ mơ? Giản đồ là InnoDB, có thể được thay đổi nếu khác sẽ cung cấp một giải pháp mở rộng hơn.

Để tham khảo, tôi nhận được kết quả tìm kiếm từ một bộ id được trả về từ Solr. Tôi muốn sử dụng mysql cho việc thu hồi cuối cùng vì nó sẽ làm cho sắp xếp và lọc cuối cùng của những kết quả này dễ dàng hơn nhiều (tôi sẽ không nhận được vào các chi tiết của lý do tại sao).

EDIT:

Truy vấn có thể sử dụng một điều khoản LIMIT chừng nào TRÊN vẫn chứa đựng tất cả 100000 của id

Ví dụ:

SELECT * FROM awesomeTable WHERE id IN (1,2,3,4......100000) LIMIT 10; 
+1

tốt hơn để sử dụng phân loại của solr nếu bạn muốn đạt được hiệu suất. – sathis

+0

Bạn có thực sự phải tìm nạp nội dung thực tế của tất cả nghìn hàng không? Bạn không thể thực hiện việc phân trang của bạn và sau đó bắt đầu tìm nạp trên mỗi trang? – cherouvim

+0

@cherouvim anh ta cần phải phân loại.đó là lý do tại sao anh ấy chọn tất cả các bản ghi tôi giả định. – sathis

Trả lời

1

Tôi là tôi và không thực sự biết khuôn khổ của bạn, bạn nên thử chèn những ID đó vào bảng tạm thời và sử dụng bảng này với sự tham gia đơn giản bên trong. Điều đó có thể chứng minh là nhanh như IN này.

+0

Tôi đã suy nghĩ về điều này, nhưng sẽ không phải là viết trên cao khi gọi INSERT cho hàng trăm ngàn ids lớn hơn bất kỳ lợi ích thu được từ việc tham gia bên trong? –

+0

Quan trọng hơn, thường có giới hạn trên về mức độ lớn (trong ký tự) mà một truy vấn SQL đơn lẻ có thể nhận được. Danh sách 'IN()' dài là cách tốt để đạt đến giới hạn đó. Sử dụng bảng tạm thời tránh điều này. Ngoài ra, giải pháp bảng tạm thời có thể hiệu quả hơn nhiều nếu bạn cần sử dụng danh sách nhiều lần. – sleske

+0

Đây có thể là trường hợp nếu đó là tìm kiếm, vì bạn có thể muốn phân trang kết quả. – NoDataFound

0

Tôi đã đưa ra cùng một câu hỏi trong khi chèn vào bảng mysql. Kích thước truy vấn có thể phụ thuộc vào cấu hình mysql của bạn.

Cách tiếp cận của tôi là chia bộ sưu tập id lớn thành một số phần.

Sử dụng Ruby on Rails:

all_ids.each_slice(10000) do |ids_part| 
    query = "INSERT INTO ..." 
end 

Có lẽ đây cũng có thể là một giải pháp cho việc lựa chọn hàng bởi id.

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