我有一系列包含类似格式数据的表。即一个UNION
会起作用。
从概念上讲,您可以将其视为1个分区为多个表的表。
我希望将所有这些表中的数据排序
现在我遇到的问题是数据太多而无法一次性显示给用户,所以我需要在部分即页面中显示它们。
现在我的问题是我需要显示已排序的数据(如前所述)。
所以,如果我这样做:
SELECT FROM TABLE_1
UNION
SELECT FROM TABLE_2
UNION
....
SELECT FROM TABLE_N
ORDER BY COL
LIMIT OFFSET, RECORDS;
我会经常做UNION
和ORDER BY
来获取每个请求上只有相应的50个页面记录。
那么我怎样才能最有效地处理这个问题?
答案 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
。
最后,我会考虑将所有表合并到一个表中。