1

株式市場のデータを保存するために、ローカルコンピューター上にmysqlテーブルを作成しました。テーブル名はminute_data、で、構造は十分に単純です。

ここに画像の説明を入力してください

キー列を日付と記号の組み合わせにしたことがわかります-> concat(date,symbol)。このようにしてinsert ignore ...、日付と記号の組み合わせを複製せずに、テーブルにデータを追加するためのクエリを実行します。

このテーブルを使用すると、データの取得が非常に簡単になります。シンボルのすべてのデータを取得したい場合は、次のCSCOクエリを実行できます。

select * from minute_data where symbol = "CSCO" order by date;

すべてが「機能」しています。このテーブルには、すでに2,200万行を超える、1000を超えるシンボルのデータが含まれています。まだ1000個のシンボルすべてで半分も満たされていないと思っているので、テーブルのサイズを増やし続けることを期待しています。

このテーブルをクエリすると、深刻なパフォーマンスの問題が発生し始めています。たとえば、次のクエリ(特定のシンボルの最新の日付を確認するためによく実行します)は、完了するのに1分以上かかり、1行しか返されません。

select * from minute_data where symbol = "CSCO" order by date desc limit 1;  

このクエリ(これも非常に重要です)も平均して1分以上かかります:

select count(*), symbol from minute_data group by symbol;

パフォーマンスの問題により、この方法でデータを操作し続けることは非現実的です。これらは私がコミュニティに尋ねたい質問です:

このテーブルにデータセットを構築し続けるのは無駄ですか?

MySQLは、このようなデータセットにとって完全に悪い選択ですか?

パフォーマンスを向上させるために、このテーブルに何ができますか?

この目的のために(MySQLテーブルの代わりに)どのような種類のデータ構造を使用する必要がありますか?

ありがとう!

アップデート

からの出力を提供しています。これはexplain、次の2つのクエリでも同じです。

explain select count(*), symbol from minute_data group by symbol;
explain select * from minute_data  where symbol = "CSCO" order by date desc limit 1;

ここに画像の説明を入力してください

更新2

非常に簡単な修正。このクエリを実行して、上記で定義した役に立たないkey_colものを削除し、日付と記号の2つの列に主キーを作成しました。

テーブルminute_dataを変更して主キーを削除し、主キー(date、symbol)を追加します。

次のクエリを試しましたが、1秒未満で終了しました。

select * from minute_data  where symbol = "CSCO" order by date desc limit 1;

このクエリはまだ完了するのに長い時間(72秒)かかります。クエリが1つのクエリで2200万行すべてを集計する必要があるためだと思いますか?:

select count(*), symbol from minute_data group by symbol;
4

1 に答える 1

1

key_colは完全に役に立たない。複数の列に主キーを設定できることをご存知ですか?日付列のカーディナリティが高いため、その列を削除して、(日付、記号)にこの順序で新しい主キーを作成することをお勧めします。さらに、(必要な場合は)(シンボル、日付)に別の一意のインデックスを作成できます。EXPLAIN最も重要なクエリを投稿してください。そして、カーディナリティはsymbol何ですか?

アップデート:

説明でわかるのは、使用できるインデックスがなく、2,250万行全体をスキャンしていることです。上記をお試しください。現時点でkey_colを削除したくない場合は、少なくともシンボル列にインデックスを追加する必要があります。

于 2013-03-25T10:24:50.827 に答える