1

InnoDB mysql データベースに問題があります。たとえば、次のアーキテクチャを持つ 2 つのテーブル、events と events_artists があります。

events:
id (PK)
host_id
date

events_artists:
id (PK)
event_id
artist_id

テーブル events には約 100,000 のエントリがあり、events_artists には約 150,000 のエントリがあります。

私がしなければならないことの 1 つは、テーブル events_artists で参照されていないテーブル events のエントリをチェックすることです。そのために、別の投稿でクエリを受け取りました

SELECT * FROM events WHERE id IS NULL OR id NOT IN (SELECT event_id FROM events_artists)

ロジックから、このクエリは私には良さそうです。ただし、非常に遅いです。1時間実行しましたが、まだ結果はありません。何かが間違っている必要があります。

これを最適化する方法についての助けに感謝します!

ありがとう

チャールズ

解決策が見つかりました

次のクエリを使用すると、ステートメントが大幅に高速化されます。

SELECT * 
FROM events a
     LEFT JOIN events_artists b
     ON a.id = b.event_id
     WHERE b.event_id IS NULL;

ただし、主な速度向上は外部キーの追加でした。重複検索のために一時的にそれらを削除する必要があり、今すぐ追加し直したため、速度が大幅に向上しました。以前はクエリに 1 時間以上かかっていましたが、現在は1 秒しかかかりません。

ありがとうございました!

チャールズ

4

3 に答える 3

3

より高速な結果を得るには、サブクエリの使用を避ける必要があります。別の方法として、LEFT JOIN を使用して、events にはあるが events_artists にはないレコードを取得することもできます。

結合の視覚的な説明をご覧ください

SELECT * 
FROM events a
     LEFT JOIN events_artists b
         ON a.id = b.event_id
WHERE b.event_id IS NULL;

また、クエリの実行を高速化するために、列 id と event_id にインデックスがあることを確認してください。

于 2012-07-23T09:54:06.813 に答える
1

クエリを実行するEXPLAINと、サブクエリが として扱われることがわかります。つまりDEPENDENT、テーブルの行ごとに 1 回実行されるため、処理eventsが遅くなります。

次のように独立したものに変更できます。

SELECT events.*
FROM events
LEFT JOIN events_artists ON (events.id = events_artists.event_id)
WHERE events_artists.event_id IS NULL
于 2012-07-23T09:54:44.100 に答える
1

これを試して

select 
    ev.* from events as ev 
    left join events_artists as ea on ev.id=ea.event_id
where 
    ea.event_id is null or ev.id is null
于 2012-07-23T09:58:45.157 に答える