0

既存のファイル名とダウンロードしたファイル名を含む 2 つのテーブルがあります。既存のファイル テーブルには 61,000 件以上のレコードがあり、ダウンロードされたファイル テーブルには 34,000 件以上のレコードがあります。このクエリを使用して、まだダウンロードされていないファイル名を見つけます!

SELECT * FROM filesWHERE filename<> '' AND filenameNOT IN (SELECT filenameFROM downloads)

これは、レコードが少ないときは正常に機能していましたが、数日前に 50k と 20k のレコードがあったとき、5/6 分で結果を取得するように遅くなりましたが、現在は次のエラーが表示されています。

内部サーバー エラー 500
サブプロセス (php) からの応答がなく、終了シグナル: 0

filename フィールドは、テーブルのファイル名フィールド (varchar 255) であり、両方のフィールドにインデックスが付けられます。助けてください。

4

3 に答える 3

1

まず、 と にインデックスを追加しfilesますdownloads。これにより、検索がはるかに高速になります。これには数分かかる場合があります。

ALTER TABLE files ADD INDEX (filename);
ALTER TABLE downloads ADD INDEX (filename);

次に、LEFT JOINサブクエリの代わりに a を使用します。

SELECT f.*
FROM files f
LEFT JOIN downloads d ON
    d.filename = f.filename
WHERE
    d.filename IS NULL
    AND f.filename <> ''

これらの変更後、検索には 1 秒もかかりません。

于 2013-06-28T22:17:36.113 に答える