私は両方ともにvenue_id
という2つの大きなテーブルを持っています。それは2つの独立した値であるため、外部キーではありません。彼らは、次のとおりです。2つのテーブルにまたがるWHEREを使用したMySQL経由の大規模テーブルクエリ
table: activity_retail
columns: activity_id, venue_id, created_at
indexes: activity_id (PRIMARY), (activity_id, venue_id) INDEX
table: activity
columns: activity_id, item_id, venue_id, created_at
indexes: activity_id (PRIMARY), (created_at) INDEX
私はvenue_id
が各テーブルにX
に等しいすべての活動に、それらの両方の間でクエリを実行したいと思います。だから私はどうなる:
SELECT * from activity
LEFT JOIN activity_retail on activity_retail.activity_id = activity.activity_id
WHERE activity_retail.venue_id = X or activity.venue_id = X
ORDER BY activity_retail.created_at desc LIMIT 0, 25
私もページネーションのために、このクエリを実行する必要がある場合があります
状況が存在しない可能性がactivity_id
activity_retail
で、それはオプションのフィールドですので、私ができます」内部結合を行うには、左結合でなければなりません。ここで
はEXPLAIN
次のとおりです。
1 PRIMARY activity index ix_ivi_created created_at 8 NULL 25 Using where
1 PRIMARY activity_retail eq_ref PRIMARY PRIMARY 4 activity.activity_id 1
それは(EXPLAIN
に応じて)小さなクエリですが、それは実行に非常に長い時間がかかり、EXTRAS
エリアには何も使用しません。
これを正しく動作させる方法については、 OR
ステートメントを使用して2つのテーブルの条件を基本的にアドバイスしてください。 AND
は本当にうまく機能しますが、ここにはOR
が必要です。
「venue_idが各テーブルにXに等しい」あなたは私たちがあなたのインデックスを見ることができますか?また – ghenghy
テーブルの上に記述を提供することができ、あなたが言うが、あなたのどちらのテーブルでもvenue_idとXが同じではない場合 – ghenghy
サンプルデータと目的の結果も参考になります – ghenghy