【问题标题】:Efficient way to merge-sort data from multiple tables从多个表中合并排序数据的有效方法
【发布时间】:2013-05-07 22:28:19
【问题描述】:

我有一系列包含类似格式数据的表格。 IE。 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 条记录。

那么我将如何最有效地处理这个问题?

【问题讨论】:

  • 您可以将数据选择到临时表中,然后为页码或其他内容添加一列吗?
  • @DavidStarkey:所以创建一个类似查找表的东西?
  • @DavidStarkey: 这样做的流程是什么?在应用程序级别,如果没有这样的临时表,我创建一个然后将其用于请求?还是其他方式?
  • 对“分页”做一些研究。
  • 新表只需要包含相关数据。根据数据的排序方式,您可以在表格底部添加新条目 (WHERE newTable.MAX(timestamp)<otherTables.Timestamp),这样可以确保您拥有所有数据,而不必每次都检查一遍。这实际上完全取决于您的查询进行的速度。如果您提供的查询运行得很快,那么每次请求数据时,创建一个临时表(按您的需要排序)并从中选择 ID 介于正确值(1-50、51-100 等)之间的位置。

标签: mysql sql algorithm sorting


【解决方案1】:

我的第一次尝试是对每个表中的少量记录进行联合:

( 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

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

【讨论】:

  • 您知道使用 sphinx/solr/elasticsearch 是否有意义吗?在我的情况下,将表合并为一个不是一种选择(表很大并且具有不同的结构),也可以创建临时表,因为数据每十秒(或更频繁)更新一次。听听你的意见很有趣
  • 我想这是有道理的,但我不能建议。考虑将此作为一个问题提出,并链接到此问题以获取上下文。
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 2011-10-16
  • 2018-01-21
  • 2018-11-25
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
相关资源
最近更新 更多