mysql如何优化 while 循环与 SQL 查询?

标签: MySQL PHP
发布时间: 2017/4/9 23:19:04
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
$id = $user['id']; // the ID of the logged in user, we are retrieving his friends
$friends = $db->query("SELECT * FROM friend_requests WHERE accepted='1' AND (user1='".$id."' OR user2='".$id."') ORDER BY id DESC");

while($friend = $friends->fetch_array()) {
    $fr = $db->query("SELECT id,profile_picture,age,full_name,last_active FROM users WHERE (id='".$friend['user1']."' OR id='".$friend['user2']."') AND id != '".$id."'")->fetch_array(); 
    echo $fr['age'];     
}

我基本上遍历所有的朋友,并获取每一个有关的信息。

我知道,它是效率不高,这么多次运行此查询,考虑到会有数以千计的"朋友",但我不完全确定如何去优化它,如何将我以前对这个问题进行优化。任何帮助被感激,谢谢。

解决方法 1:

在评论中的那篇文章是伟大的。你肯定会想要弄清楚如何自己编写联接。这里是我在为你写的尝试。虽然你现在在改写查询,您可能希望向不 * 列从 friend_requests (或任何在所有因为你要使用联接)。你拉将不得不被加载到内存,所以任何你可以避免拉任何列会帮忙。特别是如果你是 PHP 服务器和数据库服务器不在同一台机器 (更少的数据通过网络)。

不管怎么说,这里是我在黑暗中拍摄︰

$id = $user['id'];

$friends = $db->prepare("
    SELECT
        freq.* 
        ,users.id AS users_id
        ,users.profile_picture
        ,users.age
        ,users.full_name
        ,users.last_active
    FROM friend_requests freq
    INNER JOIN users u ON users.id IN (freq.user1,freq.user2) AND freq.id != u.id
    WHERE
        freq.accepted='1'
        AND ? IN (freq.user1,freq.user2
    ORDER BY freq.id DESC");
if($friends) {

    $friends->bindParam("s",$id);

    if($friends->execute()) {
        // get_result() only works if you have the MySQL native driver. 
        // You'll find out real quick if you don't
        $myFriends = $friends->get_result();

        while($row = $myFriends->fetch_assoc()) {
            echo $row['age'];     
        }
    }
}
else {
    printf("SQL Error: %s.<br>\n", $friends->error);
}
// cleanup
$friends->close();

快速参考︰ get_result()

官方微信
官方QQ群
31647020