2

次の構造のテーブルがあります。

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'

しかし、私はテーブルから本当に何が必要かを考え始めました。どのサーバーでどのイベントが発生したか、またどのサーバーでどのイベントが発生したかを日付順に並べ替えて知りたい。whereorderbyが使用されるすべての組み合わせのインデックスを追加しました。

いくつかの計算、グループ化、平均化などを行いたいので、すべての行が必要です。しかし、私は多くの質問をするのではなく、.NET環境でそれを行っています。

ただし、選択に制限を追加すると、処理が速くなります。では、ボトルネックは転送されるデータの量であり、実際には検出/選択部分ではありませんか?もしそうなら、アプリケーションを再構築して1日だけで計算を行い、結果を別のテーブルに保存して、後ですべてを集計することができます。

どうすれば手順をスピードアップできますか?MongoDBに切り替える方が良いでしょうか?現在、MySQLとInnoDBを使用しています。

4

1 に答える 1

0

あなたがここで提供していない情報がたくさんあります - そのうちのいくつかは私のコメントで他の場所で言及しました.

単一ノードでは、NoSQL が MySQL よりもはるかに高速になることはほとんどありません。MySQL でハンドラー APIを適切なインデックスと共に使用するよりも高速であるとしたら、非常に驚​​かれることでしょう。

説明計画の一部を提供しました (ただし、説明されているクエリは提供していません) - しかし、これについての解釈は提供していません:

行 = 84148

必要な結果を得るために、本当に多くの行を処理する必要がありますか? そうであり、結果が集計されていない場合は、8 万行のデータをフロントエンドに送信する必要がある理由を考える必要があります。集約されていない行をいくつか返すだけでよい場合は、インデックスを分析する必要があります。

すべての組み合わせにインデックスを追加しました

インデックスが多すぎると、インデックスが少なすぎるのと同じくらいパフォーマンスが低下します。

于 2012-09-05T08:23:30.863 に答える