web-dev-qa-db-ja.com

MySQLを読み取り専用に最適化しますか?

14 GBのCSVがあり、合計で1億3800万行になります。これを最初にInnoDBを使用してMySQLテーブルにインポートし、次にMyISAMを使用して再試行しました。どちらの場合も、主キーの単純なSELECT(自動インクリメントされたintです)は6〜7秒かかりましたが、MyISAMは5〜6秒で少し高速な場合がありました。

データを1回書き込むだけでよく、mysqlimportを使用しています。それを念頭に置いて、クエリ速度をどのように改善できますか?

... RAM=の2つのギグがあり、すべてが1つのテーブルである(そしてクエリの性質上、その状態を維持する必要がある)ことは何の価値もありません。それが最高のパフォーマンスですか?ハードウェアを前提にできますか?それとも、圧縮など、他に試してみるべきことはありますか?それとも、もっと多くのRAMが必要ですか?

6
tiredofcoding

MyISAM ROW FORMAT

テーブルが多くのVARCHARフィールドである場合、私は以下を提案したいと思います

ロードするすべてのMyISAMテーブルについて、事前にこれを行います

ALTER TABLE mytable ROW_FORMAT=Fixed;

これにより、何も変更せずにクエリのパフォーマンスを15〜30%向上させます。これを行うと、テーブルとインデックスが大きくなります。

私はこれに関する以前の投稿があります:

RAMの増加

インデックスが多数ある場合は、DBサーバーでRAM=を増やしてから、すべてのMyISAMインデックスページをキーバッファーにプリロードしてください。

最初に、必要なキーバッファーの大きさを計算します(ギガバイト単位)。

SELECT CEILIING(SUM(index_length)/POWER(1024,3)) SuggestedKeyBufferSize
FROM information_schema.tables
WHERE engine='MyISAM' AND table_schema NOT
IN ('information_schema','performance_schema','mysql');

SuggestedKeyBufferSizeをDBサーバー用に設定できる場合は、次のようにします(例4G)。

ステップ01)これを/etc/my.cnfに設定します

[mysqld]
key_buffer_size=4G

ステップ02)すべてのMyISAMインデックスをプリロードする

これを行う方法についての私の投稿を参照してください: MySQLウォームプロシージャ

2
RolandoMySQLDBA