2016-03-22 32 views
4

は、私は、「ユーザ名」めちゃめちゃ遅いSQLのサブクエリを持つクエリと

SELECT usernames.NAME, 
    COUNT(user.id) 
FROM user 
INNER JOIN user_username ON user.id = user_username.user_id 
INNER JOIN usernames ON user_username.user_username_id = usernames.id 
WHERE 
    user.datecreated BETWEEN '2016-01-01' AND '2016-09-01' 
    AND user.id IN 
     (
      SELECT user_id 
      FROM user_username 
      GROUP BY user_id 
      HAVING COUNT(*) > 1 
     ) 
GROUP BY usernames.NAME 
ORDER BY user.id DESC 

クエリが動作中に複数のエントリを持っているどのように多くのエントリが「ユーザー」でカウントするこのクエリを持っている「HAVING」が、あまりにもあります遅く、私はこのクエリをスピードアップするために何ができるか?

+0

サブクエリを実行するにはどのくらい時間がかかりますか? – Langosta

+2

あなたの文の 'EXPLAIN PLAN'を見直すべきです。 –

+0

クエリは183秒かかり、サブクエリは0.063秒になります。 – flaggalagga

答えて

0

は、このヘルプのようなクエリを分割していますか?

CREATE TEMPORARY TABLE QualifiedUserIDs AS (
SELECT user_id 
FROM user_username 
GROUP BY user_id 
HAVING COUNT(*) > 1); 

SELECT usernames.NAME, 
    COUNT(user.id) 
FROM user 
INNER JOIN QualifiedUserIDs quids ON quids.user_id = user.id 
INNER JOIN user_username ON user.id = user_username.user_id 
INNER JOIN usernames ON user_username.user_username_id = usernames.id 
WHERE 
    user.datecreated BETWEEN '2016-01-01' AND '2016-09-01' 

GROUP BY usernames.NAME 
ORDER BY user.id DESC 
+0

私はこの解決策を検討しました。魅力のように働く、ありがとう。 – flaggalagga

0

の質問は少しあいまいですが、これを試してみてください。

SELECT usernames.name, COUNT(user.id) 
FROM user 
INNER JOIN user_username ON user.id = user_username.user_id 
INNER JOIN usernames  ON user_username.user_username_id = usernames.id 
WHERE 
    user.datecreated BETWEEN '2016-01-01' AND '2016-09-01' 
    AND (SELECT COUNT(*) where user_id = user.id from user_username) > 1 

GROUP BY usernames.name 
ORDER BY user.id DESC 

私はあなたがactualyよりUSER_NAMESを持つユーザーを取得するためのuser_idによってグループに持っていないと思います。

編集これは良いと思います。左外部結合を作成します(あなたはuser.idを繰り返して複数の行を取得します)。 user_id=user.idは、私の頭のスピンになりサイドノート... userusernames.nameuser_username.user_iduser.iduser_username.user_username_idusernames.id、オン

SELECT user.id, COUNT(usernames.name) -- to show the number of usernames a user has 
FROM user 
LEFT JOIN user_username ON user.id = user_username.user_id 
LEFT JOIN usernames  ON user_username.user_username_id = usernames.id 
WHERE user.datecreated BETWEEN '2016-01-01' AND '2016-09-01' 
GROUP BY user.id 
HAVING COUNT(usernames.name) > 1 
ORDER BY user.id DESC 

...

+0

悪い例には申し訳ありません。元のクエリにはこれらの名前はありませんでしたが、テーブルなどの実際の名前を表示することはできません。 – flaggalagga

関連する問題