2013-05-13 38 views
5

Tôi có một loạt các bảng chứa dữ liệu có định dạng tương tự. I E. a UNION sẽ hoạt động. Khái niệm bạn có thể nghĩ về nó như là 1 bảng phân vùng thành nhiều bảng. Tôi muốn lấy dữ liệu từ tất cả các bảng được sắp xếp.
Bây giờ vấn đề tôi có là dữ liệu quá nhiều để được hiển thị cùng một lúc cho người dùng, vì vậy tôi cần hiển thị chúng trong các phần tức là các trang.
Bây giờ vấn đề của tôi là tôi cần hiển thị dữ liệu được sắp xếp (như đã nói).Cách hiệu quả để hợp nhất sắp xếp dữ liệu từ nhiều bảng

Vì vậy, nếu tôi làm điều gì đó như:

SELECT FROM TABLE_1 
UNION 
SELECT FROM TABLE_2 
UNION 
.... 
SELECT FROM TABLE_N 
ORDER BY COL 
LIMIT OFFSET, RECORDS; 

tôi liên tục sẽ làm một UNIONORDER BY để có được ví dụ chỉ 50 bản ghi tương ứng của các trang trên mỗi yêu cầu.

Vậy làm cách nào để xử lý hiệu quả nhất điều này?

+0

Bạn có thể CHỌN dữ liệu INTO một bảng tạm thời và sau đó thêm một cột cho số trang hoặc một cái gì đó? –

+0

@DavidStarkey: Vì vậy, tạo một cái gì đó giống như một bảng tra cứu? – Cratylus

+0

Về cơ bản, có. –

Trả lời

1

nỗ lực đầu tiên của tôi sẽ là UNION'ing chỉ là một số ít hồ sơ từ mỗi bảng:

(SELECT FROM table_1 ORDER BY col LIMIT @offset, @records) 
UNION 
... 
(SELECT FROM table_N ORDER BY col LIMIT @offset, @records) 
ORDER BY col LIMIT @offset, @records 

Nếu chứng minh không đầy đủ ở trên, tôi sẽ xây dựng một bảng chỉ số bằng tay (dựa trên gợi ý thông minh David Starkey của) .

CREATE TABLE index_table (
    table_id INT, 
    item_id INT, 
    col DATETIME, 
    INDEX (col, table_id, id) 
); 

Sau đó cư index_table với một phương pháp theo ý thích của bạn (công việc định kỳ, gây nên trên bảng table_n, ...). Câu hỏi SELECT của bạn sẽ trông giống như sau:

SELECT * 
FROM (SELECT * FROM index_table ORDER BY col LIMIT @offset, @records) AS idx 
LEFT JOIN table_1 ON (idx.table_id = 1 AND idx.item_id = table_1.id) 
... 
LEFT JOIN table_n ON (idx.table_id = n AND idx.item_id = table_n.id) 

Tuy nhiên, tôi không chắc chắn về cách truy vấn như vậy sẽ thực hiện với nhiều LEFT JOIN. Nó thực sự phụ thuộc vào bao nhiêu bảng table_n có.

Cuối cùng, tôi sẽ xem xét hợp nhất tất cả các bảng vào một bảng duy nhất.

+0

Bạn có ý tưởng nào về việc sử dụng sphinx/solr/elasticsearch không? Việc hợp nhất bảng thành một không phải là một tùy chọn trong trường hợp của tôi (bảng rất lớn và có cấu trúc khác), tạo bảng tạm thời, vì dữ liệu được cập nhật sau mỗi mười giây (hoặc thường xuyên hơn). Thật thú vị khi nghe ý kiến ​​của bạn – Tebe

+0

Tôi cho rằng nó sẽ có ý nghĩa, nhưng tôi không thể tư vấn. Cân nhắc đặt câu hỏi này như một câu hỏi và liên kết đến câu hỏi này cho ngữ cảnh. – RandomSeed

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