株式市場のデータを保存するために、ローカルコンピューター上に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;