0

次のクエリがボトルネックを引き起こしていることがわかりました(実行時間は40秒以上かかります!)

DELETE FROM doctors 
WHERE (SELECT COUNT(loc_id) 
       FROM locations 
       WHERE locations.loc_doctor = doctors.doc_id) = 0 AND 
       doctors.doc_user = $myVar

問題はその(SELECT COUNT(loc_id) FROM locations WHERE locations.loc_doctor = doctors.doc_id) = 0セクションにあると思いますよね?それを改善する方法はありますか?

4

3 に答える 3

2

これは少し速くなるはずです:

DELETE FROM doctors WHERE doctors.doc_user = $myVar AND NOT EXISTS (SELECT 1 FROM locations WHERE locations.loc_doctor = doctors.doc_id LIMIT 1)

0を数えるのは、実際にはNOT EXISTSチェックです。また、locations.loc_doctor列のインデックスも検討する必要があります(まだ持っていない場合)。

于 2012-10-05T08:34:24.443 に答える
2

外部結合から削除することを提案します:

DELETE doctors
FROM doctors LEFT JOIN locations
   ON locations.loc_doctor = doctors.doc_id
WHERE locations.loc_id IS NULL
AND doctors.doc_user = $myVar
于 2012-10-05T08:41:21.720 に答える
1

@tpeczekの回答に制限を追加したいと思います。

DELETE FROM doctors WHERE doctors.doc_user = $myVar AND NOT EXISTS (SELECT * FROM locations WHERE locations.loc_doctor = doctors.doc_id limit 1)
于 2012-10-05T08:46:57.400 に答える