【问题标题】:Most efficient algorithm to retrieve data from database从数据库中检索数据的最有效算法
【发布时间】:2012-08-12 00:30:36
【问题描述】:

因此,当我准备迁移到不支持此功能的 Cassandra,而是支持许多选择语句时,我正在从查询中删除联接。我对我的 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

【问题讨论】:

  • 我认为多查询导致的大部分减速来自磁盘访问...我认为如果条目数量更多,您会发现选择更快...(但我可能是错的)。 .. 我会用 1k 个或更多条目来测试它
  • @JoranBeasley - 数据库中的 1k 个条目非常少。
  • @JoranBeasley 与原来的 8.8 相比,检索 1000 条记录与 50 条记录相比,我执行的数组操作与使用一堆查询相比,速度提高了 10 倍,因此肯定会出现更少的查询并且更多的原生 O(n) 操作更快。
  • @jordanm 是的,我知道......更像 100k 会很好,但它超过了他最初处理的 100 行
  • 出于好奇,您在 MySQL 测试中使用的是什么引擎?

标签: php python mysql nosql cassandra


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      相关资源
      最近更新 更多