2

私はこの質問から始めました:私の大きな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_21)とまったく同じ定義で呼び出される新しいテーブルを作成しました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秒で完了します。すばらしい。

4

2 に答える 2

2

EXISTSを使ってみましたか(...)

select datediff(date,now()) from minute_data  
where EXISTS(SELECT * FROM minute_data WHERE symbol = "CSCO") 
AND symbol = "CSCO" order by date desc limit 1;

シンボルは主キーですが、タイムスタンプもPKとして使用しているようです。これにより、COMPOSITE pkを使用しているように見えます。つまり、タイムスタンプ、シンボルの順に並べられています。タイムスタンプが最初である複合インデックスしかない場合は、シンボルに個別のインデックスを付けることをお勧めします。

于 2013-03-25T12:53:26.507 に答える
0

symbols名前を付けたテーブルを作成し、そのテーブルへの参照をテーブルに追加する方がよいと思いminute_dataます。

記号
symbol_id(INT、主キー、自動インクリメント)
symbol_text(VARCHAR)

minutes_data
key_col(BIGINT、主キー、自動インクリメント)
symbol_id(INT、インデックス)
other_field

参照を追加するためのテーブルタイプとしてInnoDBを使用します。

テーブルへの重複エントリを避けるようにしてください。

于 2013-03-25T12:56:52.737 に答える