非常に大きな MySQL テーブルのすべての列の失敗率を計算するのに問題があります。小さなテーブルがどのように見えるかの例を次に示します。
TABLE1 に 5 列と 100 行があると仮定すると、
CREATE TABLE IF NOT EXIST TABLE1 (id VARCHAR(255) NOT NULL, col1 DOUBLE NOT NULL, col2 DOUBLE NOT NULL, col3 NOT DOUBLE NULL, col4 NOT DOUBLE NULL);
「col1」から「col4」までの各列には独自の上限と下限があり、「col1」から「col4」の失敗の割合を見つける必要があります。これは、現在計算を実行する方法の例です。
行の総数を計算し、列「id」でグループ化します
SELECT id, COUNT(*) FROM TABLE1 GROUP BY id;
col1、col2、col3、col4 がすべての制限を満たす行の総数を計算し、列「id」でグループ化します
SELECT id, COUNT(*) FROM TABLE1 WHERE (col1 BETWEEN 0 AND 10) AND (col2 BETWEEN 10 AND 20) AND (col3 BETWEEN 20 AND 30) AND (col3 BETWEEN 30 AND 40) GROUP BY id;
col1 制限を満たさない行の総数を計算する
SELECT id, COUNT(col1) FROM TABLE1 WHERE (col1 NOT BETWEEN 0 AND 10) GROUP BY id;
col1 の制限を満たしているが、col2 の制限を満たしていない行の総数を計算し、「id」でグループ化します
SELECT id, COUNT(col2) FROM TABLE1 WHERE (col1 BETWEEN 0 AND 10) AND (col2 NOT BETWEEN 10 AND 20) GROUP BY id;
col1、col2 の制限を満たしているが、col3 の制限を満たしていない行の総数を計算し、「id」でグループ化します
SELECT id, COUNT(col3) FROM TABLE1 WHERE (col1 BETWEEN 0 AND 10) AND (col2 BETWEEN 10 AND 20) AND (col3 NOT BETWEEN 20 AND 30) GROUP BY id;
col1、col2、col3 の制限を満たしているが、col4 の制限を満たしていない行の総数を計算し、「id」でグループ化します
SELECT id, COUNT(col4) FROM TABLE1 WHERE (col1 BETWEEN 0 AND 10) AND (col2 BETWEEN 10 AND 20) AND (col3 BETWEEN 20 AND 30) AND (col3 NOT BETWEEN 30 AND 40) GROUP BY id;
上記の 5 つのクエリを実行し、結果を 1 つのデータ フレームにまとめる R スクリプトを作成しました。R によって処理された後の出力の例を次に示します。
id,total_no_rows,yield,col1,col2,col3,col4
CATEGORY1,25,80%,2%,8%,4%,6%,0%
CATEGORY2,25,70%,6%,14%,2%,6%,2%
CATEGORY3,25,90%,5%,0%,5%,0%,0%
CATEGORY4,25,65%,20%,2.5%,2.5%,5%,5%
この方法を使用すると、小さなテーブルの結果をかなり迅速に得ることができます。ただし、テーブルが非常に大きくなると、たとえば 1000 列と 100 万行になると、計算を完了するのに約 2 時間かかり、非常に長くなります。
とにかく計算を高速化することはできますか?
- インデックスを作成しようとしましたが、どうやら MySQL は 1000 列のインデックスを作成できません。
- 同時クエリ (一度に 10 件のクエリ) を試しましたが、あまり改善されませんでした。(ちなみに私はInnoDBを使用しています)
- ユーザーがテーブルを小さなチャンクに分割してクエリの実行を高速化することを提案している投稿をいくつか読みました。ただし、生データの管理が不十分で (長い話)、すべてのデータが 1 つの大きなテキスト ファイルにダンプされます。したがって、生データを小さなチャンクに分割することは困難です。
この種の問題に対処する別の方法があれば教えてください。
編集:
マニからの提案は、結果を得るために多くの時間を節約したようです. ただし、非常に大きなテーブル (数千の列と数百万の行) の場合、クエリを完了するのに約 10 分かかります。クエリ時間をさらに改善する方法はありますか?