次の構造のテーブルがあります。
ID, SourceID, EventId, Starttime, Stoptime
すべてのID列はchar(36)であり、時刻は日付です。
問題は、テーブルのクエリが非常に遅いことです。私は700万行あり、テーブルに常に書き込み(挿入または更新)しているスレッドが約60〜70あります。
反対側には、このテーブルから読み取る必要のあるGUIがあり、ここでは遅くなります。作成されたすべてのイベントを選択したい場合は、where SourceID = something
約300秒かかります。SourceIDにはインデックスがあります。私は同じクエリを取り、explainキーワードを最初に置きます。これを取得しました。
select type = simple
type = ref
possible_keys = sourceidnevent,sourceid
key = soruceid
key_len = 109
ref = const
rows = 84148
そしてクエリ
SELECT * FROM tabel where sourceid='28B791C7-D519-4F0C-BC03-EFB1D4AC9CEB'
しかし、私はテーブルから本当に何が必要かを考え始めました。どのサーバーでどのイベントが発生したか、またどのサーバーでどのイベントが発生したかを日付順に並べ替えて知りたい。whereとorderbyが使用されるすべての組み合わせのインデックスを追加しました。
いくつかの計算、グループ化、平均化などを行いたいので、すべての行が必要です。しかし、私は多くの質問をするのではなく、.NET環境でそれを行っています。
ただし、選択に制限を追加すると、処理が速くなります。では、ボトルネックは転送されるデータの量であり、実際には検出/選択部分ではありませんか?もしそうなら、アプリケーションを再構築して1日だけで計算を行い、結果を別のテーブルに保存して、後ですべてを集計することができます。
どうすれば手順をスピードアップできますか?MongoDBに切り替える方が良いでしょうか?現在、MySQLとInnoDBを使用しています。