我以多种不同的方式编写查询,mysql性能页面表明,您只需使用基准测试,因为有时子查询速度更快,而其他时候连接速度更快。然而,我发现最好的解决方案是,正如我最初所想的那样,将数据写入cookie或会话并更新一次一个小时。这样用户就不会同时加载所有数据,也不

我以多种不同的方式编写查询,mysql性能页面表明,您只需使用基准测试,因为有时子查询速度更快,而其他时候连接速度更快。然而,我发现最好的解决方案是,正如我最初所想的那样,将数据写入cookie或会话并更新一次一个小时。这样用户就不会同时加载所有数据,也不,mysql,Mysql,我以多种不同的方式编写查询,mysql性能页面表明,您只需使用基准测试,因为有时子查询速度更快,而其他时候连接速度更快。然而,我发现最好的解决方案是,正如我最初所想的那样,将数据写入cookie或会话并更新一次一个小时。这样用户就不会同时加载所有数据,也不会在每个页面上加载数据。仅当cookie/会话信息已过期时。 $stmt=$db->prepare("SELECT COUNT(*) AS cnt FROM stream_updates

我以多种不同的方式编写查询,mysql性能页面表明,您只需使用基准测试,因为有时子查询速度更快,而其他时候连接速度更快。然而,我发现最好的解决方案是,正如我最初所想的那样,将数据写入cookie或会话并更新一次一个小时。这样用户就不会同时加载所有数据,也不会在每个页面上加载数据。仅当cookie/会话信息已过期时。
$stmt=$db->prepare("SELECT COUNT(*) AS cnt
                    FROM stream_updates 
                        INNER JOIN members 
                    ON members.username=stream_updates.username 
                    WHERE (stream_updates.time between (NOW() - INTERVAL 1 DAY) AND NOW())
                    AND (members.username = :user) OR members.username IN (
                           SELECT friend2 as username FROM list_friends 
                           WHERE (friend1 = :user AND friend2 <> :user) 
                              UNION
                           SELECT friend1 as username FROM list_friends
                           WHERE (friend2 = :user AND friend1 <> :user)
                    )");
$stmt->bindParam(':user', $username);
$stmt->execute();
$textcnt1 = $stmt->fetchColumn();

$stmt=$db->prepare("SELECT COUNT(*) AS cnt
                    FROM stream_updates 
                        INNER JOIN members 
                    ON members.username=stream_updates.username 
                    WHERE (stream_updates.time between (NOW() - INTERVAL 2 DAY) AND (NOW() - INTERVAL 1 DAY))
                    AND (members.username = :user) OR members.username IN (
                           SELECT friend2 as username FROM list_friends 
                           WHERE (friend1 = :user AND friend2 <> :user) 
                              UNION
                           SELECT friend1 as username FROM list_friends
                           WHERE (friend2 = :user AND friend1 <> :user)
                    )");
$stmt->bindParam(':user', $username);
$stmt->execute();
$textcnt2 = $stmt->fetchColumn();
(NOW() - INTERVAL 1 DAY) AND NOW())
(NOW() - INTERVAL 2 DAY) AND (NOW() - INTERVAL 1 DAY))
id   |     select_type     |    table     |  type   |  possible_keys  |   key    |  key_len  |        ref         |  rows  |  Extra
-------------------------------------------------------------------------------------------------------------------------------------
1    |       PRIMARY       |  favorites   |   ALL   |      NULL       |   NULL   |  NULL     |         NULL       |    9   |   
1    |       PRIMARY       |    members   |  eq_ref |    username     | username |    257    | favorites.username |    1   | Using where; Using index
2    | DEPENDENT SUBQUERY  | list_friends |   ALL   |      NULL       |   NULL   |    NULL   |        NULL        |    3   |    Using where
3    |   DEPENDENT UNION   | list_friends |   ALL   |      NULL       |   NULL   |    NULL   |        NULL        |    3   |    Using where
NULL |    UNION RESULT     |  <union2,3>  |   ALL   |      NULL       |   NULL   |    NULL   |        NULL        |  NULL  |
SELECT datediff(NOW(), `stream_updates`.`time`) AS days, COUNT(*) AS cnt
FROM stream_updates 
INNER JOIN members ON members.username = stream_updates.username 
WHERE datediff(NOW(), `stream_updates`.`time`) < 3
AND (
  members.username = :user
  OR
  members.username IN (
    SELECT DISTINCT if(friend2 = :user, friend1, friend2)
    FROM list_friends 
    WHERE friend1 = :user
    OR friend2 = :user
  )
)
GROUP BY 1
SELECT datediff(NOW(), `stream_updates`.`time`) AS days, COUNT(*) AS cnt
FROM stream_updates 
INNER JOIN members ON members.username = stream_updates.username 
WHERE datediff(NOW(), `stream_updates`.`time`) < 3
AND (
  members.username = :user
  OR EXISTS (
    SELECT 1 FROM list_friends WHERE
    (members.username = friend1 AND friend2 = :user)
    OR 
    (members.username = friend2 AND friend1 = :user)
  )
)
GROUP BY 1
ALTER TABLE list_friends ADD INDEX f1f2(friend1,friend2)