从多个表合并排序数据的有效方法

时间:2013-05-13 19:27:37

标签: mysql sql algorithm sorting

我有一系列包含类似格式数据的表。即一个UNION会起作用。 从概念上讲,您可以将其视为1个分区为多个表的表。 我希望将所有这些表中的数据排序 现在我遇到的问题是数据太多而无法一次性显示给用户,所以我需要在部分即页面中显示它们。
现在我的问题是我需要显示已排序的数据(如前所述)。

所以,如果我这样做:

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

我会经常做UNIONORDER BY来获取每个请求上只有相应的50个页面记录。

那么我怎样才能最有效地处理这个问题?

1 个答案:

答案 0 :(得分:1)

我的第一次尝试将是UNION,每张桌子只有少量记录:

( 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

如果上述证明不足,我会建立一个手动索引表(基于David Starkey的聪明建议)。

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

然后使用您喜欢的方法填充index_table(cron作业,触发表table_n,...)。您的SELECT语句将如下所示:

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)

但是,我不确定这样的查询将如何执行这么多LEFT JOIN。这实际上取决于有多少个表table_n

最后,我会考虑将所有表合并到一个表中。