0

Web サイトのプロファイルのプレビューを生成するクエリを作成しています。

クエリにはいくつかのテーブルが含まれ、特定の情報、つまり名前と特定のプロファイルの統計の COUNT() を取得します。つまり、いいねの数です。

以下のクエリは、実行に時間がかかります。私が目にする問題の 1 つは、LEFT JOINS を使用してすべてのデータを取得していることです。まず第一に、どのクエリにどのJOINを使用するかを選択する方法について、誰かが私を助けることができます.

それ以外に、私が間違っていることを誰でも見ることができます。実行に時間がかかるのは何ですか。

クエリは次のとおりです。

SELECT  u.id AS id, 
        u.about AS About, 
        CONCAT(u.fn,' ',u.ln) AS Fullname, 
        u.username AS Username, 
        i.image AS Image,
        COUNT(DISTINCT a.id) AS Contacts,
        COUNT(DISTINCT ul.id) AS Thumbs,
        u.views AS Views,
        COUNT(DISTINCT o.id) AS TrybesStarted,
        COUNT(DISTINCT ti.id) AS TrybesJoined,
        COUNT(DISTINCT ai.id) AS AmbitionsSupporting,
        COUNT(DISTINCT am.id) AS AmbitionsCompleted,
        COUNT(DISTINCT sp.id) AS Posts
FROM x_table1 u
    /* PIC */
    LEFT JOIN x_table2 i
    ON u.id = i.user_id
    /* CONTACTS */
    LEFT JOIN x_table3 a
    ON (u.id = a.to  AND a.accepted = 1 OR u.id = a.from AND a.accepted = 1)
    /* THUMBS UP */
    LEFT JOIN x_table4 ul 
    ON (u.id = ul.profile_id)
    /* TRYBES STARTED */
    LEFT JOIN x_table5 o 
    ON (u.id = o.profile_id)
    /* TRYBES JOINED */
    LEFT JOIN x_table6 ti 
    ON (u.id = ti.to AND ti.accepted = 1)

    /* AMBITIONS SUPPORTING */
    LEFT JOIN x_table7 ai
    ON (u.id = ai.to AND ai.accepted = 1)

    /* AMBITIONS COMPLETED */
    LEFT JOIN x_table8 ao
    ON (u.id = ao.profile_id)
    LEFT JOIN x_table9 am
    ON (ao.ambition_id = am.id AND am.complete = 1)

    /* POSTS */
    LEFT JOIN x_table10 sp 
    ON (u.id = sp.profile_id)

WHERE u.id = '1234userid'

すべてのテーブル データが正しいと仮定して、必要に応じてリクエストを送信してください。

Ps/* AMBITIONS COMPLETED */クエリを追加する前は、問題なく実行されていたようです。二重のLEFT JOINが含まれているためだと思います。

前もって感謝します

4

2 に答える 2

1

何時間もの調査の結果、次のデータを取得するための別のクエリ手法に出会いました。

Array
(
    [ID] => useridentifier
    [ABOUT] => ABOUT :)
    [NAME] => Chris m
    [REGISTERED] => 2013-10-21 12:54:50
    [USERNAME] => Cwiggo
    [VIEWS] => 3
    [IMAGE] => useridentifier
    [AWARDS] => 0
    [TRYBANK] => 1
    [USER_CONTACTS] => 6
    [USER_THUMBS_UP] => 6
    [TRYBES_STARTED] => 28
    [TRYBES_JOINED] => 13
    [USER_POSTS] => 8
    [AMBITIONS_STARTED] => 40
    [AMBITIONS_JOINED] => 13
    [AMBITIONS_COMPLETE] => 1
    [Retreival] => 0.00026202201843262
)

このデータは、データベースのいくつかのテーブルから収集されます。ご覧のとおり、クエリ速度は非常に高速です。とにかく、ハングアップよりも優れています。

クエリの変更は次のとおりです。基本的に異なるテーブルに対して繰り返されるコードであるため、スニペットを提供します。

SELECT u.id AS ID, 
    u.registered                AS REGISTERED, 
    u.x_account_username        AS USERNAME,
    COALESCE(uc.cnt, 0)         AS USER_CONTACTS,
    COALESCE(ut.cnt, 0)         AS USER_THUMBS_UP,

    FROM x_user u

    #IMAGES
    LEFT JOIN x_user_images images  ON u.id = images.user_id

    #CONTACTS
    LEFT JOIN 
      ( SELECT `to`,accepted,`from`, COUNT(*) AS cnt FROM
        x_allies
        GROUP BY `to`) uc
    ON (u.id = uc.to AND uc.accepted = 1 OR u.id = uc.from AND uc.accepted = 1)

    #THUMBS UP
    LEFT JOIN 
      ( SELECT user_id, COUNT(*) AS cnt FROM
        x_user_likes
        GROUP BY user_id ) ut
    ON u.id = ut.user_id
WHERE u.id = 'useridentifier'

この回答が、データベース テーブルから統計情報にアクセスし、要約し、照合しようとしている開発者の助けになることを願っています。

コメントありがとうございます

于 2014-09-04T15:17:44.580 に答える
0

テーブル x_table8 と x_table9 を追加した後にクエリが遅くなった場合は、x_table9 テーブルに大きなデータが含まれていると考えられます。LEFT JOIN を避けるようにしてください。x_table9 テーブルにレコードが関連付けられていなくても、x_table8 からのレコードが必要な場合に LEFT JOIN を使用するには、LEFT JOIN のみを使用します。

これを使用してプロファイルを生成していると言ったように、プロファイル ID のデータがないテーブルとして JOIN を使用することをお勧めします。

LEFT JOIN を避けることができない場合は、一時テーブルを使用して、それらの TEMP TABLES をクエリで使用すると、はるかに高速になります。

これをはるかに迅速に行うことを願っています。

于 2014-09-04T09:07:13.183 に答える