5

同様の形式のデータを含む一連のテーブルがあります。つまり、UNIONうまくいくでしょう。概念的には、複数のテーブルに分割された 1 つのテーブルと考えることができます。これらすべてのテーブルからデータをソートして取得したいと考えています。
今私が抱えている問題は、データが多すぎてユーザーに一度に表示できないことです。そのため、それらを部分的に、つまりページに表示する必要があります。
今私の問題は、ソートされたデータを表示する必要があることです(すでに述べたように)。

したがって、次のようなことをすると:

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

私は常にUNIONandを実行ORDER BYして、たとえば、各リクエストでページの対応する 50 レコードだけを取得します。

では、これを最も効率的に処理するにはどうすればよいでしょうか。

4

1 に答える 1

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数に大きく依存します。

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

于 2013-05-14T09:59:53.383 に答える