3

私は現在、(本当に)大きな文字列データベースにアクセスし、それらを特定の「リクエスト文字列」と比較する必要があるWebアプリケーションを構築しています-これは、さまざまな比較方法(同一の単語の数、スケーラブルで、さらに重要なことに、高速である必要があります。

比較メソッド自体をCで実装することを考えました。これは、PHP のような「ウェブビー」言語が多いにもかかわらず、明らかにインタープリターよりもはるかに高速であるためです。これにより、次の 3 つの疑問が生じました。

1) C アプリケーションを Web サーバー(現在は Apache)に「接続」するにはどうすればよいですか? 私は通常の CGI の方法について考えましたが、リクエストごとに 1 つの新しいプロセスを作成する必要があるため、スケーラビリティと速度が低下します - 少なくとも私はそれについて読んだことがあります。

2)このユースケースで C を使用するのに最適なデータベース技術はどれですか?

3) 最後になりましたが、MySQL データベースに接続する PHP スクリプトを作成することで、苦労する価値があると思いますか?それとも、通常の方法で十分でしょうか?速度の違いはどれくらいですか?

前もって感謝します、デビッド

4

2 に答える 2

2

悪いアプリケーションアーキテクチャ、悪いデータベース設計、悪いコードは常に非効率的に実行され、スケーラブルではありません。

それを邪魔にならないようにすると、ほとんどの「非常に需要の高い」目的は、解釈された言語のいずれかで提供できます-それらはそれらが行うことで最適化されていることを忘れないでください(たとえば、メモリを浪費しますが、通常、需要の高い使用でもかなり高速です) 。

私たちは本当の答えに到達すると言った:

データベース設計では、すべてのユースケースに完全なアプローチはありません。最高の読み取り速度を実現する方法と、最高の書き込み速度を実現する方法、および最高の柔軟性を実現する方法(ただし、読み取り速度と書き込み速度の両方を犠牲にする)でデータベースを構造化する必要がある場合があります。セクションには高い読み取り速度が必要な場合があり、別のセクションには高い書き込み速度が必要な場合があり、さらに別のセクションには高い柔軟性が必要な場合があります。

データベースの設計方法を考えて、「すべてのデータを収集するには、セッションでデータベースに300回接続する必要がありますか、それとも一度にすべてを読み取ることができる1つの大きなステートメントを記述できますか」と自問してください。簡単に達成できるのは、SQLストアドプロシージャを記述できるかどうかを考えてみてください。再び空になった場合は、構造を変更して(たとえば、柔軟性を犠牲にして)、ワンライナー読み取りまたはストアドプロシージャ読み取りを可能にするかどうかを考えてください。

いずれにせよ、PHPからMySQLへの多くの接続が1つのクエリを送信するということは、PHPがネットワーク経由でMySQLサーバーに接続し(ローカルであっても)、MySQLがリクエストを処理して回答などを提供します。送信する予定のすべてのステートメントを1つの文字列にバッチ生成できる場合は、それを1つの文字列にまとめることができますが、そうでない場合は、それらをより小さなバッチにグループ化することもできます。

上記のすべてが受け入れられない場合、または今日Cスクリプトを書くためのコツが本当にある場合(どうしても称賛に値する意図):

いくつかのUDF(ユーザー定義関数)を定義するCMySQLモジュールの作成を検討する必要があります。MySQLがデータを読み取っている時点で、行レベルのデータにアクセスでき、出力集計とそのすべてのジャズを処理できます。

ApacheモジュールまたはPHPモジュールを作成すると、MySQLモジュールとほぼ同じ形式でデータが配信されますが、処理はMySQLサーバー内で実行されず、MySQLにデータを要求し、処理してさらにデータを要求します。

于 2012-10-18T21:12:48.110 に答える
0

Apache-2.4.x には mod_dbd があり、Apache 構成ファイルから直接、さまざまなデータベース バックエンド (速度のためにコンパイル済みのクエリを使用) と通信できます。これは、たとえばmod_rewrite のルールで使用して、クエリの結果に応じて受信リクエストを変更できます。

つまり、アプリケーションの詳細によっては、コーディングを完全に回避できる場合があります。

ただし、コードを記述する必要がある場合は、最初に、最もよく知っている言語でプロトタイプを実装することをお勧めします。「十分に高速」になる可能性は十分にあります。または、リクエストごとに費やされる時間の大部分がデータベース側に費やされ、言語の選択が無関係になる可能性があります。

C からデータベース バックエンドに接続するのは簡単です。各データベース ベンダーは、C プログラム用のクライアント ライブラリを (少なくとも 1 つ) 実装しています。

アプリが同じ (単一の) データベースと通信するために複数の HTTP サーバーを必要としない場合、最適な DB はローカルの DB になります: SleepyCat (現在は Oracle) の「db」、gdbm、または SQLite3。

また、更新 (データベースへの変更) が頻繁でない場合は、フラットファイルを使用してメモリ内にデータベースを構築できます...これにより、データベースの最大サイズが制限されますが、最速になり、処理を回避できます (再)接続など

編集: memcache は外部データベースです。同じシステムで実行されているか、リモートのシステムで実行されているかに関係なく、それに接続して対話し、そのメモリから自分のメモリにデータをコピーする必要があります。データベースの変更が頻繁でない場合は、自分のメモリに何かを保持し、そこから直接使用することをお勧めします。

于 2012-10-18T20:41:59.513 に答える