2013-05-13 9 views
5

私は、類似のフォーマットのデータを含む一連のテーブルを持っています。私。 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レコードのみ。

これを最も効率的に処理するにはどうすればよいですか? (デビッド・スターキーの巧妙な提案に基づく)

(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 

上記不足が判明した場合、私は手動でインデックステーブルを構築します:

+0

一時テーブルにデータを選択して、ページ番号などの列を追加できますか? –

+0

@DavidStarkey:ルックアップテーブルのようなものを作成しますか? – Cratylus

+0

本質的には、はい。 –

答えて

1

私の最初の試みは、各テーブルからのレコードのUNION'ingちょうど少数だろう。

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) 

しかし、私はのJOINのような問合せは、非常に多くのLEFTを実行する方法をのを確認していません。それは本当に多くのテーブルに依存しますtable_nがあります。

最後に、すべてのテーブルを1つのテーブルにマージすることを検討します。

+0

sphinx/solr/elasticsearchを使用するのが理にかなっていますか?データが10秒(またはより頻繁に)更新されるので、テーブルを1つにマージすることは私のケースでは選択肢ではありません(テーブルは膨大で構造が異なります)。ちょうどあなたの意見を聞いて面白い – Tebe

+0

私はそれが理にかなっていると思うが、私は助言することはできません。これを質問として考え、文脈のためにこの質問にリンクしてください。 – RandomSeed

関連する問題