4

そのため、これをサポートしていないが、代わりに多くのselectステートメントをサポートしている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
4

2 に答える 2

3

Cassandraを使用すると、マルチgetを使用して、1つのクエリですべてのキーを要求できます。これは、多数の単一クエリよりもはるかに高速です。クエリで何千ものキーを要求することがありますが、応答時間は事実上瞬時です。

于 2012-08-16T13:16:08.873 に答える
0

playOrm(未加工のアドホックツールも登場)のように、テーブルのパーティション(テーブル全体ではなく)でのみ結合をサポートし、バックグラウンドでnosqlパターンを使用してインデックスを作成するツールがますます増えています。幅の広いパターンをチェックして、それがあなたに役立つかどうかを確認してください。ITは時々物事をスピードアップするのに役立ちます。

于 2012-08-21T14:38:37.847 に答える