11

、およびフィールドlanguage_stringsで呼び出されるMySQLテーブルを介して国際化をサポートするPHP/MySQLベースのWebアプリケーションがあります。string_idlang_idlang_text

選択した言語で文字列を表示する必要がある場合は、次の関数を呼び出します。

public function get_lang_string($string_id, $lang_id)
    {
        $db = new Database();
        $sql = sprintf('SELECT lang_string FROM language_strings WHERE lang_id IN (1, %s) AND string_id=%s ORDER BY lang_id DESC LIMIT 1', $db->escape($lang_id, 'int'), $db->escape($string_id, 'int'));
        $row = $db->query_first($sql);

        return $row['lang_string'];
    }

これは完全に機能しますが、多くのデータベースクエリが実行されている可能性があるのではないかと心配しています。たとえば、メインメニューには5つのリンクテキストがあり、そのすべてがこの関数を呼び出します。

language_strings選択したテーブルの結果全体lang_idをPHP配列にロードし、それを関数から呼び出す方が速いでしょうか?潜在的に、それはその多くが冗長である巨大な配列になるでしょうが、明らかにそれは多くではなくページのロードごとに1つのデータベースクエリになるでしょう。

誰かがこれを行う別のより効率的な方法を提案できますか?

4

6 に答える 6

8

大文字と小文字を区別しない答えはありません。ケースバイケースのステートメントで実際に見ることができます。そうは言っても、ほとんどの場合、1 つのクエリですべてのデータを取得し、それを配列またはオブジェクトにポップして、そこから参照する方が高速です。

注意点は、5 つの個別のクエリを実行するのと同じくらい迅速に、1 つのクエリで必要なすべてのデータを取得できるかどうかです。ここで、クエリ自体のパフォーマンスが重要になります。

サブクエリを 1 つまたは 2 つ含むクエリは、いくつかのクエリを個別に実行するよりも実際には時間効率が悪い場合があります。

私の提案は、それをテストすることです。必要なすべてのデータを取得するクエリをまとめて、実行にかかる時間を確認します。他の 5 つのクエリのそれぞれの時間を計測し、それらを合わせた時間を調べます。ほぼ同一の場合は、出力を配列に貼り付けます。データベース自体に頻繁に接続する必要がないため、より効率的です。

ただし、結合されたクエリがデータを返すのに時間がかかる場合 (たとえば、インデックスを使用する代わりにフル テーブル スキャンが発生する可能性があります)、個々のクエリに固執します。

最後に、同じデータを何度も使用する場合は、配列またはオブジェクトにアクセスする方がデータベースから取得するよりもはるかに高速であるため、毎回勝敗が決まります。

于 2012-08-21T08:56:50.727 に答える
4

OK - いくつかのベンチマークを行ったところ、個々のクエリを使用するのではなく、配列に物を入れる方が平均で 10 ~ 15% 遅いことがわかりました。

その理由は、「珍しい」要素を除外しても、必然的に未使用の要素が必ず存在するからだと思います。

個々のクエリでは、必要なものしか得られず、クエリが非常に単純であるため、その方法に固執するのが最善だと思います。

これは私にとってはうまくいきます。もちろん、個々のクエリがより複雑な他の状況では、共通データを配列に格納する方法がより効率的であることが判明すると思います。

于 2012-08-21T13:05:50.673 に答える
1

私の答えは、その間に何かをすることです。特定の長さ (たとえば 100 文字) より短い lang_id のすべての文字列を取得します。短いテキスト文字列は、長いテキスト文字列よりも複数の場所で使用される可能性が高くなります。get_lang_string() の静的連想配列にエントリをキャッシュします。アイテムが見つからない場合は、クエリを使用して取得します。

于 2012-08-21T09:50:24.470 に答える
0

私は現在site/application、ブレーキをかけなければならず、スピードについて非常に慎重に考えなければならないところにいます。上記の速度テストでは、サーバーのトラフィック量を結果に影響を与える重要な変数と見なす必要があると思います。データを JavaScript データ構造に入れ、それをクライアント マシンで処理する場合、処理時間はより規則的になります。たとえば、php を介して mysql を介して大量のデータを要求している場合、これはデータを分散させるのではなく、1 つのマシン/サーバーに要求を課しています。トラフィックが増加するにつれて、サーバー リソースを多くのユーザーと共有する必要が生じます。これは、JavaScript をより多く実行させることで、サーバーの負荷を軽減できると考えています。経由でローカル マシンにデータを保存することもできます。localstorage.setItem(); / localstorage.getItem();(ほとんどのブラウザーには、ドメインごとに約 5 MB のスペースがあります)。データベースにそれほど頻繁に変更されないデータがある場合は、それをクライアントに保存してから、「起動」時にまだ日付/有効かどうかを確認できます。

これは、アカウントを1年間使用してから投稿した最初のコメントなので、とりとめのないものを微調整する必要があるかもしれません-現在考えていることを声に出すだけです.

于 2014-05-20T13:15:41.990 に答える