2016-08-30 7 views
0

20c/40t 256ギガバイトサーバー上の狭い行〜500mの分散テーブルにインデックスを作成するには数時間を要し、私の人生ではなぜそれが理解できません。この記事のよう Memsqlでインデックスを作成するのに時間がかかるのはなぜですか?

alter table users_userlocation add index date3 (date, user_id);

CREATE TABLE users_userlocation ( id bigint(20) unsigned NOT NULL, user_id mediumint(9) unsigned NOT NULL, lat float NOT NULL, lon float NOT NULL, speed decimal(4,2) NOT NULL, status_id tinyint(4) unsigned NOT NULL, date datetime NOT NULL, prev_date datetime DEFAULT NULL, next_date datetime DEFAULT NULL, point geographypoint DEFAULT null, /*!90618 SHARD */ KEY user_id (user_id), KEY date (date DESC,user_id), KEY point (point), KEY date2 (user_id,date DESC), KEY date3 (date,user_id) );

、上記6.5時間稼動しています。

答えて

2

MemSQLではインデックスの構築がかなり遅いです。コア当たり約10〜20,000行の変換が一般的です。これは、テーブルの特性やインデックスの追加に依存します(インデックスの少ないテーブルの細い行は速くなります)。索引ビルドは、実行中の作業負荷(CPU使用率)にはほとんど影響しません。 SHOW CREATE TABLEとCREATE INDEX文を共有できれば、何か異常があるかどうかを確認できます。

+0

こんにちはアダム、返信ありがとうございます。上記の匿名化されたスキーマを追加しました(実際のカラム名は敏感です)。複数の日付/ユーザーインデックスの理由は、スキップリストのパフォーマンスを試してみることでした。たとえば、ある日付範囲での単純な選択カウント(*)は、予想よりも遅く実行されます(同じハードウェア上でGreenplumよりもはるかに遅い)。私はDESCインデックスを使用していたかどうか疑問に思っていたので、ASCオーダーで追加しています。 – QEternity

+0

また、リーフあたり10〜20kの場合、コアごとに正しいですか?そして、FWIWは、インデックスを追加すると私のCPU使用量が最大になります。 – QEternity

+0

はい、コアあたり10K〜20K行。ランダムなデータでテーブルのスキーマを簡単にテストしました。私のテストでは、変更はコア当たり16.5K行で実行されました(8コアで1600万行のテーブルを実行するには2分かかりました)。あなたが大量の書き込みワークロードを変更と同時に実行していた場合、大幅に遅くなる可能性があります(50%以上)。 –

関連する問題