0

私たちの Web サイトの 1 つに、約 60,000 レコードを含むテーブルがあります。最近、ページがタイムアウトしていることに気付きました。これを解決するには、メモリ制限を -1 に設定する必要があります。これにより、ページの読み込みが可能になりましたが、非常に遅くなりました。さらに、明らかに何かが正しくないことを示しているため、これが問題を解決する正しい方法だとは思いませんでした。

ページが実行していたクエリを出力できました。

SELECT u.*,
(SELECT COUNT(*) FROM enquiry e WHERE e.user_id = u.id AND e.deleted = 0 AND e.time_started != 0) AS opened_count,
(SELECT COUNT(*) FROM enquiry e WHERE e.user_id = u.id AND e.deleted = 0 AND e.confirmed = 1 AND e.time_started != 0) AS confirmed_count,
(SELECT COUNT(*) FROM enquiry e WHERE e.user_id = u.id AND e.deleted = 0 AND e.call_back = 1 AND e.time_started != 0) AS call_back_count
FROM user u
WHERE u.active = 1 AND u.deleted = 0
ORDER BY u.username

このクエリを phpMyAdmin で実行したところ、結果が返されるまでに 30 秒以上かかりました。

何らかの方法でクエリを最適化する必要があると感じていますが、その方法を見つけるのに苦労しています。何らかのJOINを使用する必要があると思いますか?

4

1 に答える 1

7

これら 3 つのサブクエリのそれぞれがユーザー テーブルのすべての行に対して 1 回実行されるため、実際には 180,000 を超えるクエリを実行しています。

いくつかのグループとの標準結合に単純化してみることができます。

SELECT user.*,
    COUNT(enq.id) AS opened_count
    SUM(e.confirmed = 1) AS confirmed_count
    SUM(e.call_back = 1) AS call_back_count
FROM user
LEFT JOIN  enquiry ON enquiry.user_id = user.id
WHERE user.active = 1 and user.deleted AND enquiry.deleted = 0
GROUP BY user.id
于 2013-09-30T19:37:05.180 に答える