私は、ユーザーが特定の遺伝子を照会し、異なる遺伝子セット間のさまざまな統計を計算できるようにする、生化学研究者用のウェブサイトを作成しました。MYSQLメモリ最適化の読み取り専用DB
MySQLデータベースは16GBで、読み取り専用です(私たちの研究室でこの新しいデータが生成され、このデータを表示するポータルはこのWebサイトです)。ウェブサイトのパフォーマンスをテストして、DBクエリがアプリの中で最も遅いことに気付きました。 DB全体をメモリに格納したいが、一般的に受け入れられるソリューションにはいくつかの問題がありました。
私は8コアの32GBサーバーを使用しています。
オプション1:設定ENGINE = MEMORY
少数の列はタイプmediumtext
のものであり、64K行の制限を超えてMEMORY ENGINE
オプション2に投入されることを拒否する:innodb_buffer_pool_size
これは実際にデータをメモリに格納しているようではありません。私は使用されたバッファプールを(https://dba.stackexchange.com/questions/27328/how-large-should-be-mysql-innodb-buffer-pool-size)のテクニックを使ってチェックしましたが、使用されたバッファプールは〜100Mbsしか見ませんでした。 innodb_buffer_pool_size
は24GBに正しく設定されています。
オプション3:RAMディスクを作成し、そこに 上でDBを置くこれは、いくつかのSOの記事をもとに偉大なオプションのようには思えません。
どうすればいいですか?お知らせ下さい。
を最適化することができ、ここで
をプロファイリングするための
サンプル?すべてのクエリを最適なインデックスに使用しますか?あなたはテーブルと行について少し詳しく教えてください。 –
バッファは、dbが使われている間だけ時間がたてば満たされます。あなたは実際にそれが変動する負荷の下で、しばらく走らせましたか? –
作業しているデータを*使用していないと、バッファープールがいっぱいになりません。いったん使用すると、MySQLはディスクからそれを読み取り、それをバッファプール(RAM)に追加するので、次に対処するときにそれがあります。一時的なブラックホールテーブルを作成し、それにデータをロードすることによって、バッファプールをプリロードするためのトリックがあります: 'CREATE TEMPORARY TABLE preload ENGINE = BLACKHOLE SELECT * FROM table_to_preload_into_buffer_pool'。私は起動時にこれをプリロードできる設定オプションがあるかどうかはわかりませんが、これはバッファプールをプリロードするのに役立ちます。 –