私のデータベースサーバーがメモリデータベースエンジンをサポートしていることに気づきました。パフォーマンスのために、すでに実行中のInnoDBをメモリ内で完全に実行するデータベースを作成したいと思います。
それ、どうやったら出来るの?PHPMyAdminを調べましたが、「エンジンの変更」機能が見つかりません。
コメントに記載されているように MEMORY エンジンを使用することの結果を理解していると仮定すると、here、および検索で見つかる他のいくつか (トランザクションの安全性がない、ロックの問題など) - 次のように進めることができます。
MEMORY テーブルは InnoDB とは異なる方法で格納されるため、エクスポート/インポート戦略を使用する必要があります。最初に、 を使用して各テーブルを個別にファイルにダンプしますSELECT * FROM tablename INTO OUTFILE 'table_filename'
。MEMORY データベースを作成し、次の構文で使用するテーブルを再作成しますCREATE TABLE tablename (...) ENGINE = MEMORY;
。LOAD DATA INFILE 'table_filename' INTO TABLE tablename
次に、各テーブルを使用してデータをインポートできます。
また、MySQL データ ディレクトリをtmpfsに配置して、データベースの書き込みおよび読み取り呼び出しを高速化することもできます。これは最も効率的な方法ではないかもしれませんが、ストレージ エンジンを変更できない場合もあります。
MySQL データ ディレクトリの fstab エントリは次のとおりです。
none /opt/mysql/server-5.6/data tmpfs defaults,size=1000M,uid=999,gid=1000,mode=0700 0 0
innodb_flush_log_at_trx_commit=2設定も確認してください。おそらく、これで MySQL が十分に高速化されるでしょう。
innodb_flush_log_at_trx_commit は、mysql ディスクのフラッシュ動作を変更します。2 に設定すると、毎秒バッファのみをフラッシュします。デフォルトでは、挿入ごとにフラッシュが発生するため、より多くの IO 負荷が発生します。
メモリ エンジンは、探しているソリューションではありません。最初にデータベースにアクセスしたもの (つまり ACID) はすべて失われます。
より良い代替手段を次に示します。
LEFT [OUTER] JOIN は、サーバーがより適切に最適化できる可能性があるため、同等のサブクエリよりも高速になる可能性があります。これは、MySQL サーバーだけに固有の事実ではありません。
最後のポイントが重要です。以前は結合が大好きでしたが、1 億行以上のいくつかのテーブルで結合を実行する必要がありました。ダメ。結合するデータをそのターゲット テーブルに挿入し (多すぎない場合)、インデックス付きの列に対してクエリを実行すると、数ミリ秒でクエリが取得されます。
それらが役立つことを願っています。
データベースが十分に小さい場合 (または十分なメモリを追加した場合)、データは最初のリクエストの後にキャッシュされるため、データベースは効果的にメモリ内で実行されます。
メモリ エンジンを使用するようにデータベース テーブル定義を変更することは、おそらく必要以上に複雑です。
エンジンを使用してテーブルをメモリにロードするのに十分なメモリがある場合はMEMORY
、innodb 設定を調整してすべてをキャッシュするのに十分なメモリがあります。
「どうすればいいですか? PHPMyAdmin を調べましたが、「エンジンの変更」機能が見つかりません。」
質問のこの部分に直接応答して、を発行するALTER TABLE tbl engine=InnoDB;
と、適切なエンジンでテーブルが再作成されます。
メモリ ストレージ エンジンの代わりに、MySQL Cluster を検討できます。同様のパフォーマンスを提供すると言われていますが、耐久性のためにディスクバックアップ操作をサポートしています. 私はそれを試していませんが、有望に見えます (そして、何年もの間開発されています)。