0

ここでは、日付範囲を選択する基本的なクエリを用意しています。(処理に比較的長い時間がかかるようです) 処理時間を改善するにはどうすればよいか考えていました。これがクエリです。

SELECT h.id as hid,h.created_on,u.id as uid,u.fname,u.lname,u.email  
FROM hud h 
LEFT JOIN user_hud uh on h.id = uh.hid 
LEFT JOIN users u on u.id = uh.uid 
WHERE 
    h.created_on 
    BETWEEN DATE_SUB( CURDATE( ) ,INTERVAL 12 MONTH ) 
        AND DATE_SUB( CURDATE( ) ,INTERVAL 7 DAY)
4

2 に答える 2

1

hud.iduser_hud.hidusers.iduser_hud.uidおよびhud.created_on列にインデックスを作成します。

インデックスがない場合、テーブル全体の結合をチェックする必要があります。インデックスを使用すると、はるかに効率的な方法を使用できます (更新/削除のパフォーマンスが低下し、ディスク容量が増えます)。

于 2013-04-06T18:22:13.360 に答える
0

まず、少なくとも次のインデックスが必要です: (created_on) は hud に、(hid) は user_hud に。次に、クエリを見て、条件が結合の最初のテーブルにあることがわかるので、その条件をサブクエリに移動できます。

SELECT hids.*, u.id as uid, u.fname,
             u.lname, u.email
FROM (
    SELECT id as hid, created_on
    FROM hud,
       (SELECT DATE_SUB( CURDATE( ) ,INTERVAL 12 MONTH ) as year_ago,
                    DATE_SUB( CURDATE( ) ,INTERVAL 7 DAY) as week_ago) d
    WHERE created_on BETWEEN year_ago AND week_ago
    ) as hids
LEFT JOIN user_hud uh USING(hid)
LEFT JOIN users u on u.id = uh.uid; 
于 2013-04-06T18:42:50.250 に答える