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.id在、user_hud.hidusers.id和列user_hud.uid上创建索引。hud.created_on

如果没有索引,则需要检查整个表的连接。使用索引,您可以使用更有效的方法(以更新/删除性能损失和更多磁盘空间为代价)

于 2013-04-06T18:22:13.360 回答
0

首先,您至少需要以下索引:hud 中的 (created_on),user_hud 中的 (hid)。然后您可以查看您的查询并意识到您的条件在连接中的第一个表上,因此您可以将该条件移动到子查询中:

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 回答