14 GBのCSVがあり、合計で1億3800万行になります。これを最初にInnoDBを使用してMySQLテーブルにインポートし、次にMyISAMを使用して再試行しました。どちらの場合も、主キーの単純なSELECT(自動インクリメントされたintです)は6〜7秒かかりましたが、MyISAMは5〜6秒で少し高速な場合がありました。
データを1回書き込むだけでよく、mysqlimportを使用しています。それを念頭に置いて、クエリ速度をどのように改善できますか?
... RAM=の2つのギグがあり、すべてが1つのテーブルである(そしてクエリの性質上、その状態を維持する必要がある)ことは何の価値もありません。それが最高のパフォーマンスですか?ハードウェアを前提にできますか?それとも、圧縮など、他に試してみるべきことはありますか?それとも、もっと多くのRAMが必要ですか?
テーブルが多くのVARCHARフィールドである場合、私は以下を提案したいと思います
ロードするすべてのMyISAMテーブルについて、事前にこれを行います
ALTER TABLE mytable ROW_FORMAT=Fixed;
これにより、何も変更せずにクエリのパフォーマンスを15〜30%向上させます。これを行うと、テーブルとインデックスが大きくなります。
私はこれに関する以前の投稿があります:
May 10, 2011
: 固定サイズのフィールドでCHARとVARCHARを使用した場合のパフォーマンスへの影響は何ですか? (TRADEOFF#2)Aug 12, 2011
: どのDBMSが超高速読み取りと単純なデータ構造に適していますか? (Par 3)Sep 20, 2011
: MyISAMとInnoDBのベストJan 03, 2012
: ハイエンドでビジーなサーバー用に最適化されたmy.cnf (見出しの下レプリケーション)インデックスが多数ある場合は、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ウォームプロシージャ