私はこの質問から始めました:私の大きなmysqlテーブルは失敗する運命にありますか?
その質問から私が見つけた答えは満足のいくものでした。2200万行のテーブルがあり、約1億行に増やしたいと考えています。現時点では、テーブルのminute_data
構造は次のようになっています。
私が抱えている問題は次のとおりです。このクエリを実行する必要があります:
select datediff(date,now()) from minute_data where symbol = "CSCO" order by date desc limit 1;
テーブルに値「CSCO」が含まれている場合、これは非常に高速です(<1秒)。問題は、テーブルにまだ存在しないシンボルをクエリする場合があることです。たとえば、symbol = "ABCD"に対して次のようなクエリを実行すると、次のようになります。
select datediff(date,now()) from minute_data where symbol = "ABCD" order by date desc limit 1;
次に、クエリに長い時間がかかります...永遠のように(180秒)。
これを回避する方法は、クエリを実行する前に、探しているシンボルがテーブルに含まれていることを確認することです。minute_data
これを行うために私が見つけた最速の方法は、followクエリを使用することです。これを使用して、探しているシンボルがテーブルに含まれているかどうかを確認する必要があります。基本的に、ブール値を返すために必要なだけなので、シンボルがテーブルにあるかどうかがわかります。
select count(1) from minute_data where symbol = "CSCO";
このクエリは1つの値を返すのに30秒以上かかりますが、実際にdatediff
計算を返す上記のクエリは1秒未満しかかからないため、私の好みには長すぎます。
symbol
列はpriキーの一部であるため、値がそこに非常に迅速に存在するかどうかを判断できるはずだと思いました。
私は何が間違っているのですか?私がやりたいことをすばやく行う方法はありますか?パフォーマンスを最適化するためにデータの構造を変更する必要がありますか?
ありがとう!
アップデート
私はこの問題の良い解決策を見つけたと思います。LastCoderによる以下の回答から、私は次のことを行いました。
minute_data_2
1)とまったく同じ定義で呼び出される新しいテーブルを作成しましたminute_data
。
2)ALTER TABLE minutes_data_2 ADD PRIMARY KEY(symbol、date);
3)INSERT IGNORE INTO minutes_data_2 SELECT * FROM minutes_data;
4)ドロップテーブルminute_data;
5)minute_data_2の名前をminute_dataに変更します
今、私は、180秒以上かかると上で説明したのと同じクエリに対して、目がくらむほど速い速度を見ていますが、今では.001秒で完了します。すばらしい。