私はサイズ8GBの大きなdbを持っており、このdbには900万の連絡先があります。すべての連絡先を取得しようとすると、1つのクエリの実行のためにすべての連絡先を取得するのに、1〜2時間(場合によってはタイムアウトになる)かかります。また、私は8 CPUと24GB RAM、Xeonプロセッサを持っています。mysqlプロセスは8 CPUに分散しません。私の質問は、単一のクエリに対してマルチスレッドを有効にできるかということです。
返信を待っています
MyISAMもInnoDBもマルチスレッドのクエリ実装を備えていません。他のXtraDB、TokuDBも同様です。これは、MySQLの長期にわたる問題と制限です。制限がMySQLサーバー内にあることはわかりませんが、ストレージエンジンの実装にあります。誰もやったことがない...
現在、列ストアのInfiniDBとInfobright IEEを評価しています。どちらもマルチCPUクエリをサポートしており、その違いは圧倒的です(複数の理由によりますが、CPUが明白な理由です)。
クエリを複数のクエリに分割し、それらを並列プロセスで実行して集計結果を返すMySQLのプロキシである Shard Query を確認することをお勧めします。
私は最近、これに対するいくつかのアプローチについての良いブログ投稿を読みました。
MySQLは、単一のクエリの処理を複数のスレッドに分割する方法を提供していません。代わりに、アプリケーション層に並列処理を実装することをお勧めします。 MySQLは別々のSELECTステートメントを並行して喜んで処理します。自動インクリメントIDがある場合は、SELECT ... WHERE id % N = 0
を使用して、テーブルを[〜#〜] n [〜#〜]の部分に分割できます。 [〜#〜] n [〜#〜]プロセスまたはスレッドを使用して、各選択ステートメントを処理します。複数のプロセスは、複数のスレッドよりも設定が少し簡単です。 xargsを使用して、複数のプロセスを並行して実行できます。