1

私の問題は、選択を行ってから、行ごとに4つの異なるリクエストSQL(狂気)を実行することです。これは、多くのリクエストを行うと推測できるため、これを使用するシステムは非常に低速です。

SELECT 
    deal_source.id, 
    deal_source.source_name, 
    deal_source.spider_status, 
    spider.last_success_date
FROM deal_source 
JOIN spider 
ON deal_source.id = spider.deal_source_id

次に、このクエリの各行に対して、次のようにします。

$total_query = "SELECT count(id) as total
                FROM spider_log 
                WHERE deal_source_id = '$deal_source_id' 
                AND date_format(date_created, '%Y-%m-%d') = '$lastdate' ";

$added_query = "SELECT count(id) as added
                FROM spider_log 
                WHERE deal_source_id = '$deal_source_id' 
                AND action = 'added'  
                AND date_format(date_created, '%Y-%m-%d') = '$lastdate' ";

$extended_query = "SELECT count(id) as extended 
                   FROM spider_log 
                   WHERE deal_source_id = '$deal_source_id' 
                   AND action = 'extended'  
                   AND date_format(date_created, '%Y-%m-%d') = '$lastdate' ";

$duplicate_query = "SELECT count(id) as duplicate 
                    FROM spider_log 
                    WHERE deal_source_id = '$deal_source_id' 
                    AND action = 'duplicate'  
                    AND date_format(date_created, '%Y-%m-%d') = '$lastdate' ";
4

2 に答える 2

3
SELECT   d.id,
         d.source_name,
         d.spider_status,
         s.last_success_date,
         COUNT(l.id) AS total,
         SUM(l.id IS NOT NULL AND l.action='added'    ) AS added,
         SUM(l.id IS NOT NULL AND l.action='extended' ) AS extended,
         SUM(l.id IS NOT NULL AND l.action='duplicate') AS duplicate
FROM     deal_source d
    JOIN spider      s
      ON s.deal_source_id  = d.id
    JOIN spider_log  l
      ON l.deal_source_id  = d.id
      ON l.date_created   >= s.last_success_date
     AND l.date_created   <  s.last_success_date + INTERVAL 1 DAY
GROUP BY d.id
于 2013-01-21T21:00:00.893 に答える
3

いくつかのポイント:

  • EXPLAINインデックスを慎重に追加することで、各クエリのパフォーマンスを最適化できます。

  • すべてのクエリを 1 つの大きなクエリに結合できるため、多くのクエリでデータベースにアクセスする必要がありません。

  • 多くのクエリに加えて、関数 ( ) を列 ( ) に適用するため、インデックスを使用できず、関数が何千回または何百万回も呼び出される (多くの行が調べられるため) ためdate_format(date_created, '%Y-%m-%d') = '$lastdate'、パフォーマンス キラーです。そのような条件を、コード内のどこにいても、次のように変更します。DATE_FORMAT()date_created

     (  date_created >= DATE('$lastdate') 
    AND date_created < DATE('$lastdate') + INTERVAL 1 DAY
     )
    

    またはさらに良いのは、それ$lastdateが日付の場合は、次のとおりです。

     (  date_created >= '$lastdate' 
    AND date_created < '$lastdate' + INTERVAL 1 DAY
     )
    

    さらに良いことに、が列の場合date_createdは、次のようになります。DATE

        date_created = '$lastdate' 
    
于 2013-01-21T21:04:50.527 に答える