微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 从数据库中检索数据的最有效算法

因此,当我准备转移到不支持功能的Cassandra时,我正在从查询删除联接,而是支持许多select语句.我在我的mysql表(我目前正在使用的)中对50行数据进行了基准测试,结果是101个查询(全部选择),完成所有这些查询需要大约0.035秒.然后我将其更改为一些数组操作(目前在PHP中)并将其减少为3个查询,其中包含一堆O(n)for循环.

我假设我的系统是在PHP,Python,MysqL还是Cassandra(Nosql)上,使用一些O(n)for循环而不是更多的查询处理数据的速度更快,我减少了时间使用这种新方法0.035s到0.004s,如下所示.

是否有其他方法可以缩短此范围?还是我走在正确的轨道上?在任何情况下运行所有​​查询的速度都会更快(除非它变为O(n ^ 2))?谢谢:

// Now go through and get all of the user information (This is slower in MysqL, but maybe faster in cassandra)
        /*foreach ($results as $key => $row)
        {
            // Create query
            $query = DB::select('id', 'username', 'profile_picture')->from('users')->where('id', '=', $row['uid']);

            // Execute it
            $results2 = $query->execute(null, false);

            // Join it
            $data[$key] = array_merge($row, $results2[0]);
        }*/

        // Get all the user information (faster in MysqL since less queries)
        $uids = array();
        $ids = array();
        foreach ($results as $key => $row)
        {
            if (!in_array($row['uid'], $uids))
                $uids[] = $row['uid'];
            if (!in_array($type, array('userProfile')))
                $ids[] = $row['comment_id'];
        }

        // Create query
        $query = DB::select('id', 'username', 'profile_picture')->from('users')->where('id', '=', $uids);

        // Execute it
        $results2 = $query->execute(null, false);

        $user_data = array();

        foreach ($results2 as $key => $row)
        {
            $user_data[$row['id']] = array('uid' => $row['id'], 'username' => $row['username'], 'profile_picture' => $row['profile_picture']);
        }

        foreach ($results as $key => $row)
        {
            $data[$key] = array_merge($row, $user_data[$row['uid']]);
        }
        // End faster user info section

解决方法:

使用Cassandra,您可以使用multi get在一个查询中询问所有键,这比一堆单个查询要快得多.我有时会在查询中询问数千个密钥,响应时间实际上是即时的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐