15

データベース内の孤立した投稿を削除しようとしており、次のクエリを作成しました:

DELETE post.*
      FROM foro_post AS post
      LEFT JOIN foro_thread AS thread USING(threadid)
      WHERE thread.threadid IS NULL

問題は、テーブルに 7,000,000 を超えるレコードがあるため、制限したいことです。

クエリで LIMIT を使用できないため、これを試して実際に機能しましたが、効率的な解決策なのか、それとももっとうまくできるのかわかりません。

DELETE post.*
      FROM foro_post AS post
      LEFT JOIN foro_thread AS thread USING(threadid)
      WHERE thread.threadid IS NULL
      AND post.postid < 500

      // Where < 500 should be increasing as I delete records

どうすればこれをより効率的に行うことができますか?

4

1 に答える 1

26

同時に複数のテーブルを参照している場合、DELETELIMIT内で直接使用することはできませんが、サブセレクト内に削除したいものを入れることで回避できます。

DELETE po 
FROM   foro_post po
JOIN   (
       SELECT    p.postid
       FROM      foro_post p
       LEFT JOIN foro_thread t ON p.threadid = t.threadid
       WHERE     t.threadid IS NULL
       ORDER BY  p.postid
       LIMIT     50
       ) pp ON po.postid = pp.postid
于 2012-08-30T17:51:20.413 に答える