1

MySQL に何百万ものレコードを含むテーブルがあります -> Wiki ページのメモを使用して Infobright にインポートしましたが、問題ありません!

テーブルの構文は次のとおりです

CREATE TABLE `myTable` (
  `a` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  `b` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  `c` bigint(20) NOT NULL,
  `d` bigint(20) NOT NULL,
  `e` int(10) NOT NULL
) ENGINE=BRIGHTHOUSE

ここで、select クエリを 450 回実行する必要があります。そのたびに、異なる「a」が制約として使用されます。

SELECT d,e FROM `myTable` WHERE a = 'myString';

目標は、合計ですべてのクエリが呼び出される時間を短縮することです。しかし、私はそれで問題を抱えています。select クエリを約 450 回実行すると、平均して各クエリに 0.52 秒かかります。

ただし、MySQL を介して実行すると、クエリごとに約 1.7 ミリ秒かかります。

これをどのように最適化してMySQL時間を打ち負かすことができますか? 「=」の代わりに「IN」句を使用し、d、e の上に「a」を追加で選択する必要がありますか? 例えば:

SELECT a,d,e FROM `myTable` WHERE a IN ('myString1','myString2'.... etc )
4

1 に答える 1

2

Infobright は、数値データの操作に優れています (特にクエリ条件に関して)。「知識グリッド」メタデータ システムを使用するため、従来の BTREE インデックスはサポートされていません。を実行するWHERE a = 'myString'と、エンジンがすべての packrow (通常は packrow ごとに 50,000 行のデータ) を開き、各レコードに対して文字列比較を行うように強制されます。

MySQL は BTREE インデックスをサポートしています。これにより、ここで指摘したようなテキストベースのクエリ条件のパフォーマンスが向上します。クエリを 450 回実行する必要があるとおっしゃいましたので、「a」には少なくとも 450 個の一意の値があると仮定します。

一意の値のセットが非常に小さいテキスト列がある場合 (たとえば、ある種のステータス インジケーターなど)、列を LOOKUP 列として定義することで大きなメリットが得られます。

`a` varchar(255) COLLATE latin1_bin DEFAULT NULL COMMENT 'lookup'

注: この種のテーブル設定は、できれば 255 ではなく varchar() の小さなサイズの割り当てを使用して、カーディナリティの低い列に対して最高のパフォーマンスを提供します。

この一連のクエリについては、MySQL を使用するか、データを再加工してこれらの値を Infobright の数値データに変換する方がよいでしょう。

この質問は約4か月前のものなので、偶然見つけた他の人の参考として投稿しています

于 2014-05-02T04:55:01.457 に答える