私は pdo に基づくデータベース クラスに取り組んでいます。使用されているデータベースは mysql データベースですが、パフォーマンスを向上させるためにデータベースをキャッシュしたいと考えています。データベースをSQliteインメモリデータベースにキャッシュし、これに対してSELECTを実行する(そしてINSERT、UPDATEなどでデータベースを更新する)のは良い考えでしょうか?しかし、「 cache = new PDO('sqlite:memory'); 」と書くと、新しいものを作成しますか、それとも既存のデータベースを使用しますか? また、1 つのサーバーが複数の Web サイトをホストしている場合、異なるメモリ内データベースをどのように使用できますか?
1 に答える
各SQLiteインメモリデータベースは接続固有です。同じプロセス内で:memory:への2つの接続を開いた場合でも、2つの別個のインメモリデータベースが作成されます。したがって、答えは、新しいデータベースが常に作成され、既存のデータベースを使用することはないということです。
インメモリデータベースを作成するために正しい名前を使用するように注意してください。:memory:以外の名前(:memorry:またはmemoryまたは/:memory:など)は、実際にはインメモリデータベースを作成しませんが、通常のファイルベースのデータベースを作成します。これは静かに起こります。
提案されたキャッシングで得られるパフォーマンスの向上は、わずかである可能性があります。MySQLで選択を行い、コンピュータに十分なメモリがある場合、OSディスクのバッファリングにより、データはすでにRAMにある可能性があります。したがって、SQLiteインメモリデータベースの形式でRAMの別のレイヤーを追加しても、あまり役に立ちません。
システムが読み取り専用でない場合、推奨されるキャッシングは、複雑または不正確なキャッシングロジックに簡単につながります。一部のプロセスがデータを更新する場合は、キャッシュを更新し、MySQLデータベースを更新する必要があります。また、他のプロセスにキャッシュが無効になり、MySQLからデータを読み取る必要があることを通知するメカニズムを作成する必要があります。そうしないと、データがすぐに混乱します。そして、2つのプロセスが同じデータを同時に異なる値に更新することを決定した場合はどうなるでしょうか。対立があります。
パフォーマンスを向上させるために、最初にサーバーとMySQLを調整します。十分でない場合は、アプリケーションプロセス固有ではなく、別のプロセスであるMemcachedのようなキャッシュを追加します。それでも、更新時にデータの一貫性が保たれるようにアプリケーションロジックを構築するように注意する必要があります。MySQLのみを使用し、InnoDBと正しいトランザクションを実行する場合、MySQLはまさにそれを実行します。