4

table1 と table2 の両方に多数の行 (つまり、数十万行) があると仮定すると、次のクエリは非効率的ですか?

編集:フィールドによる並べ替えが追加されました。

SELECT * FROM (
  SELECT title, updated FROM table1
  UNION
  SELECT title, updated FROM table2
) AS query
ORDER BY updated DESC
LIMIT 25
4

4 に答える 4

2

これはさらに高速になるはずですが、ORDER BY が表示されないので、実際に必要な 25 レコードは何ですか?

SELECT * FROM (
  SELECT title FROM table1 LIMIT 25
  UNION
  SELECT title FROM table2 LIMIT 25
) AS query
LIMIT 25
于 2013-03-27T20:39:55.187 に答える
2

明確な結果がどうしても必要な場合は、代わりにunion allandgroup by節を使用することもできます。

SELECT title FROM (
  SELECT title FROM table1 group by title
  UNION ALL
  SELECT title FROM table2 group by title
) AS query
group by title
LIMIT 25;

limitテスト データベース (at) でそれぞれ ~920K 行の 2 つのテーブルのインデックス付き ID 列で句なしでこれをテスト$workすると、上記のクエリで 1 秒を少し超え、union.

于 2013-03-27T20:48:12.460 に答える
0

はい、内部クエリで order by と limit を使用します。

SELECT * FROM (
  (SELECT title FROM table1 ORDER BY title ASC LIMIT C)
  UNION
  (SELECT title FROM table2 ORDER BY title ASC LIMIT C)
) AS query
LIMIT 25

これは、N (数十万) ではなく C 行のみを通過します。ORDER BY は必須であり、インデックス付きの列にある必要があります。

C は、ドメインに従って調整する必要がある発見的定数です。重複が少ないと予想される場合は、おそらく C=50-100 で問題ありません。

EXPLAIN を使用して、これを自分で調べることもできます。

于 2013-03-27T20:49:50.150 に答える
0

UNIONdistinctレコードをフェッチするために追加のパスを作成する必要があるため、を使用する必要がありますUNION ALL

于 2013-03-27T20:38:42.873 に答える