タイトルだけじゃ説明不足…
MEMORY テーブルを準備するために 1 時間ごとにクエリを実行しています。このテーブルは、次の 1 時間の集中的なトラフィックに使用されます。現在、クエリは次のようになっています。
INSERT INTO tmp_table
SELECT DISTINCT SQL_NO_CACHE
B.*, G.node
FROM books B
RIGHT JOIN book_genres G on G.asin=B.asin
WHERE EXISTS
(
SELECT 1 FROM genres K WHERE K.node=G.node
)
AND...[nothing special here]
したがって、books テーブルは、asin の PRIMARY KEY を持つ書籍データを保持するだけです。book_genres には asin フィールドと node フィールドが含まれ、サイトのさまざまな部分で使用される多数のノードが含まれています。ただし、tmp_table には、ジャンル テーブルにあるノードのサブセットのみを含める必要があるため、サブクエリが必要です。うまくいけば、完全なスキーマを投稿しなくてもこれで十分です。
現在、特定のジャンルを相互に排他的にしたいと考えています。これは、tmp_table を構築した後にこれを行うことを意味します。
# Delete records that should have been excluded
DELETE T FROM tmp_table T INNER JOIN
(
SELECT N.* FROM tmp_table N INNER JOIN
(
SELECT DISTINCT ASIN FROM tmp_table
INNER JOIN genres ON genres.node=tmp_table.node
WHERE isFiction=1
) F
ON F.asin=N.asin
INNER JOIN genres ON genres.node=N.node
WHERE genres.isNonFiction=1
) D
USING (asin, node)
WHERE D.asin=T.asin AND D.node=T.node
そのため、asin が isFiction=1 のジャンルにある場合、nonFiction=1 のすべてのジャンルが削除されます。
しかし、これは醜く感じます: クエリを使用してデータを追加し、再度削除することです。ダブルパスを回避するために、これを 1 つのクエリに組み合わせる方法はありますか。それとも、(いくつかの微調整と編集の後)上記が許容できるほど迅速に機能することを考えると、私は自分で仕事をしているだけですか。
任意のアイデアをいただければ幸いです。
追加された例:
books table:
asin title price etc...
B111111111 Book1 $0.99 ....
B222222222 Book2 $0.99 ....
B333333333 Book2 $0.99 ....
book_genres table:
asin node
B111111111 1111
B111111111 2222
B111111111 3333
B111111111 5555
B222222222 1111
B222222222 3333
B222222222 4444
B333333333 1111
B333333333 2222
genres table:
node name isFiction isNonFiction
1111 Bestsellers 0 0
2222 Romance 1 0
3333 Biographies 0 1
4444 History 0 1
したがって、INSERT INTO が実行された後、tmp_table は次のようになります。
asin title node
B11111111 Book1 1111
B11111111 Book1 2222
B11111111 Book1 3333
B22222222 Book2 1111
B22222222 Book2 3333
B22222222 Book2 4444
B33333333 Book3 1111
B33333333 Book3 2222
Book1 には、ノード 5555 のレコードがありません。これは、ジャンル テーブルになく、tmp_table でこれを必要としないためです。WHERE は DB 内の数百万冊の中から数千冊の本のサブセクションを識別するため、他のすべてはほとんどデータの非正規化であり、作業がはるかに高速です。
次のステップでは、書籍に isFiction ノードがある場合、その書籍のすべての isNonFiction ノードが削除されるようにします。
DELETE が実行された後、tmp_table の最終結果は次のようになります。
asin title node
B11111111 Book1 1111
B11111111 Book1 2222
B22222222 Book2 1111
B22222222 Book2 3333
B22222222 Book2 4444
B33333333 Book3 1111
B33333333 Book3 2222
Book1 は isFiction=1 を持つ 2222 ノードにあり、ノード 3333 は isNonFiction=1 であるため、ノード 3333 の唯一の違いは Book1 から削除されています。Book2 には isFiction ノードが含まれていないため、変更されません。同様に、Book3 は isNonFiction ノードを含まないため変更されません。
この段階では、この実装で動作していますが、実行時間は約 20 秒から約 40 秒に倍増しています。それはまともな解決策かもしれませんが、他の誰かが全体をより簡単または迅速にするアイデアを持っていれば幸いです.
マーク...