0

私はこのクエリを実行していますが、結果はうまくいっていますが、時間がかかりすぎるということです.誰かがこれを効率的にする方法を教えてもらえますか.最初は3つのテーブルで結合を使用していますが、そのクエリはこれよりも時間がかかります。前もって感謝します。

SELECT 
    ee_expert.expert_id , 
    AVG( ee_expert_rating.rating_stars ) AS total_rating, 
    ee_expert.expert_id, 
    COUNT( DISTINCT ee_expert_rating.rating_id ) AS rating_count 
FROM 
    ee_expert_rating 
        RIGHT JOIN ee_expert 
            ON ee_expert.expert_id = ee_expert_rating.expert_id 
WHERE 
    expert_verified_email =2 
    AND expert_brief_description != '' 
    AND expert_account_status =1 
    AND ee_expert.expert_id IN 
        (
            SELECT 
                expert_id 
            FROM 
                ee_expert_categories 
            WHERE 
                ee_expert_categories.category_id =5 
            GROUP BY 
                expert_id 
        ) 
GROUP BY 
    ee_expert.expert_id 
ORDER BY 
    rating_count DESC 
4

2 に答える 2

1

2 つのことが全体を遅くします。

  1. ネットワークを介してデータを転送し、HTML (phpMyAdmin?) で表示するため、実際のステートメントよりも遅いため、10 秒かかります。これは推測にすぎませんが、98% の場合に当てはまります。

  2. subselect を使用するIN()と常に遅くなります (すべての親データセットに対して再帰的に実行されるためだと思います)。オプションは使用しますEXISTS()

于 2013-10-01T11:23:06.240 に答える
1

これは少し速くなるはずです: (インライン group by を削除しました。この場合、exists を使用すると役立ちます。)

SELECT
    ee_expert.expert_id ,
    AVG( ee_expert_rating.rating_stars ) AS total_rating,
    COUNT( DISTINCT ee_expert_rating.rating_id ) AS rating_count
FROM
    ee_expert_rating RIGHT JOIN
    ee_expert ON ee_expert.expert_id = ee_expert_rating.expert_id
WHERE
    expert_verified_email =2 AND          
    expert_brief_description != '' AND    
    expert_account_status =1 AND          
    exists(                               
        SELECT                            
            expert_id                     
        FROM                              
            ee_expert_categories
        WHERE
            ee_expert_categories.category_id =5 and
            ee_expert_categories.expert_id=ee_expert.expert_id
    )
GROUP BY
    ee_expert.expert_id
ORDER BY
    rating_count DESC

(INも保持して/内部グループbyなしで試してください。)

于 2013-10-01T11:22:02.913 に答える