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


Most efficient algorithm to retrieve data from database

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

我假设我的系统是在PHP,Python,MySQL还是Cassandra(NoSQL)上,使用几个O(n)for循环而不是更多的查询来处理数据要快得多,我已经使用这种新方法将时间从0.035秒减少到0.004秒,如下所示。

有什么替代方法可以进一步缩短时间吗? 还是我走在正确的轨道上? 运行所有查询更快(除了当它变成 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 在一个查询中请求所有密钥,这比一堆单个查询要快得多。 我有时会在查询中请求数千个密钥,响应时间实际上是即时的。

越来越多的工具,如playOrm(也有一个原始的临时工具即将推出),它们支持联接,但仅在表的分区(而不是整个表)上,并在幕后使用nosql模式进行索引。 查看宽行模式,看看它是否对您有用。 IT 有时可以帮助加快速度。