59

私のデータベースサーバーがメモリデータベースエンジンをサポートしていることに気づきました。パフォーマンスのために、すでに実行中のInnoDBをメモリ内で完全に実行するデータベースを作成したいと思います。

それ、どうやったら出来るの?PHPMyAdminを調べましたが、「エンジンの変更」機能が見つかりません。

4

7 に答える 7

28

コメントに記載されているように 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次に、各テーブルを使用してデータをインポートできます。

于 2012-05-21T21:08:18.840 に答える
26

また、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 負荷が発生します。

于 2014-07-30T12:14:55.207 に答える
14

メモリ エンジンは、探しているソリューションではありません。最初にデータベースにアクセスしたもの (つまり ACID) はすべて失われます。

より良い代替手段を次に示します。

  1. 結合を使用しないでください。これを行う大規模なアプリはほとんどありません (Google、Flickr、NetFlix など)。

LEFT [OUTER] JOIN は、サーバーがより適切に最適化できる可能性があるため、同等のサブクエリよりも高速になる可能性があります。これは、MySQL サーバーだけに固有の事実ではありません。

- MySQL マニュアル

  1. クエリを実行している列にインデックスがあることを確認してください。EXPLAIN を使用して、それらが使用されていることを確認します。
  2. インデックス用に Query_Cache とメモリ スペースを使用して増やし、インデックスをメモリに格納し、頻繁なルックアップを保存します。
  3. 特に単純な結合の場合は、スキーマを非正規化します (つまり、barMap から fooId を取得します)。

最後のポイントが重要です。以前は結合が大好きでしたが、1 億行以上のいくつかのテーブルで結合を実行する必要がありました。ダメ。結合するデータをそのターゲット テーブルに挿入し (多すぎない場合)、インデックス付きの列に対してクエリを実行すると、数ミリ秒でクエリが取得されます。

それらが役立つことを願っています。

于 2012-05-21T21:16:04.767 に答える
6

データベースが十分に小さい場合 (または十分なメモリを追加した場合)、データは最初のリクエストの後にキャッシュされるため、データベースは効果的にメモリ内で実行されます。

メモリ エンジンを使用するようにデータベース テーブル定義を変更することは、おそらく必要以上に複雑です。

エンジンを使用してテーブルをメモリにロードするのに十分なメモリがある場合はMEMORY、innodb 設定を調整してすべてをキャッシュするのに十分なメモリがあります。

于 2012-05-21T21:12:46.047 に答える
5

「どうすればいいですか? PHPMyAdmin を調べましたが、「エンジンの変更」機能が見つかりません。」

質問のこの部分に直接応答して、を発行するALTER TABLE tbl engine=InnoDB;と、適切なエンジンでテーブルが再作成されます。

于 2014-03-11T23:13:11.513 に答える
2

メモリ ストレージ エンジンの代わりに、MySQL Cluster を検討できます。同様のパフォーマンスを提供すると言われていますが、耐久性のためにディスクバックアップ操作をサポートしています. 私はそれを試していませんが、有望に見えます (そして、何年もの間開発されています)。

MySQL Cluster の公式ドキュメントはこちらにあります。

于 2013-09-24T23:04:13.820 に答える