私は以下のような単純なMyISAMテーブルを用意しています(可読性のためにトリムされています - 実際はもっと幅があります。MySQL:COUNT(*)とGROUP BYを最適化する
CREATE TABLE IF NOT EXISTS `history` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`time` int(11) NOT NULL,
`event` int(11) NOT NULL,
`source` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `event` (`event`),
KEY `time` (`time`),
);
現在のテーブルは約6,000,000行(現在およそ16万は、以下のクエリに一致そのうち)が含まれていますが、これは増加すると予想されます。特定のイベントIDが与えられ、ソースごとにグループ化されているので、特定の時間間隔中にそのIDを持つイベントがいくつ記録されたかを知りたいと思います。質問に対する答えは、「今日、イベントXはソースAに対して120回、ソースBに対して105回、ソースCに対して900回起こった」という行に沿ったものかもしれない。
私が製作したクエリはこのタスクを実行しますが、タイムスパンが「すべての時間」に設定されている場合には1分以上かかり、1週間後には30秒を超えて実行すると大変です。
これはリアルタイムでの使用ではないため、クエリには2〜2秒かかる場合もありますが、数分ではありません。クエリを説明することは明白な理由のために私をトラブル以下、与える:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE history ref event,time event 4 const 160399 Using where; Using temporary; Using filesort
私は(そのような(イベント、時間)など)、様々なマルチカラム・インデックスを試してきたが、ない改善しました。これは、私が妥当な解決策ではないと想像することができないような一般的な使用例のようですが、私のグーグルリングは、私が既に持っているクエリのバージョンに沸騰しています。なぜパフォーマンスが非常に悪いのか)。
提案がありますか?
上のスキーマからわかるように、私が試した複数列の索引に加えて、イベントと時間の両方がそれぞれ別々に索引付けされています。 – pjohansson
すみません、私はそれを逃しました。私は 'KEY'キーワードを使って' INDEX'を指定するその構文に慣れていませんでした... 'INDEX'を' source'に追加するのはどうですか? –
phpmyadminのエクスポート機能を責めます - 私はそれに慣れていませんでした。 :)また、ソースのインデックス作成は、私のテストでは追加のメリットはありません。 – pjohansson