2012-02-24 20 views
0

私は3列の価格データの約400万行(7ギガバイトのデータ+ 9ギガバイトインデックス)とMySQLのMyISAMテーブルがあります〜(私はカーディナリティが言葉だと思います)timeseries MySQLテーブルの複数列インデックスまたは複数インデックス?

CREATE TABLE `prices` (
    `ts` datetime NOT NULL, 
    `id` int(10) unsigned NOT NULL, 
    `price` double NOT NULL, 
    PRIMARY KEY (`ts`,`instrid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1$$ 

明確なid秒の数をされてこれらの時間範囲内のほとんどの時間範囲では、カーディナリティがidは〜20より小さい(したがって、3月1日と2日の間に20以上の異なるIDがあります)。

クエリがほぼ独占的に、フォームのとおりです。

select ts, price from prices where ts between {t1} and {t2} and id = {id}. 

それは物事をスピードアップする必要があり、いくつかの指標(S)のように思えます。

tsidのインデックスを組み合わせるか、またはtsidのインデックスを組み合わせる方がよいでしょうか?いくつかの第3の代替?私は自分自身でこの質問に答える方法を学ぶことができる場所へのアドバイスを感謝します。

別のテーブルタイプ(InnoDB?)が自分の目的に適していますか?

答えて

3

私は、ts、price、idの1つの結合インデックスを使用します。通常、MySQLは2つの操作を行います。最初にインデックスを使用して行を見つけ、データベースから行を取り出します。ただし、索引にすべてのデータがある場合は、データベースから行を取得せずに索引から直接データを取得するだけです。それは「カバー指数」と呼ばれています。データベースの選択に

は、ほとんどの人が深刻な使用のためのInnoDBをお勧めしているように見える、here

+1

が合意良いの比較があります。 '(ts、id、price)'の順で列をカバーするインデックスを作成します。 –

+0

興味深い解決策です。私はこれを試して、その記事を見てみましょう。ありがとう:) –

+0

このインデックスがメモリに収まらない場合は、問題になるかどうか分かりますか? –

関連する問題