1

実行速度が非常に遅いクエリがあります。クエリを実行しているテーブルには、約10万件のレコードがあり、where句で使用されるほとんどの列にインデックスがありません。これらの列にインデックスを追加しただけですが、クエリがこれ以上速くなりません。

これは、列にインデックスを付けると、挿入時にその値がインデックスに書き込まれるためだと思います。これらのレコードがすべて追加された、インデックスを追加しました。では、テーブルで「インデックスを再実行」する方法はありますか?

編集

クエリと説明の結果は次のとおりです。

ここに画像の説明を入力してください

奇妙なことに、クエリをコピーしてSQLマネージャツールで直接実行すると、非常に高速に実行されるため、問題はクエリ自体ではなく、アプリケーションコードにある可能性があります。

4

2 に答える 2

2

これは非常に一般的な問題です。

MySQL を使用して説明します http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

SELECT ステートメントの前にキーワード EXPLAIN を付けると、MySQL はクエリ実行計画に関するオプティマイザーからの情報を表示します。つまり、MySQL は、テーブルがどのように結合され、どの順序で結合されるかに関する情報を含め、ステートメントをどのように処理するかを説明します。

これらの結果を使用して...作成したインデックスが期待どおりに機能していることを確認します。

そうでない場合は、期待どおりに機能するまでインデックスを微調整する必要があります。

これをテストしながら、新しいテーブルを作成し、インデックスを作成してから、古いテーブルから新しいテーブルにすべての要素を挿入することができます。インデックスを何百万回も削除して再追加するよりも簡単です。

于 2012-08-12T20:18:36.693 に答える
2

Mysql は一貫したインデックスを保持します。データが最初に追加されるか、インデックスが最初に追加されるか、データがいつでも変更されるかは問題ではありません。同じ最終インデックスが生成されます (最終データとインデックス タイプが同じであると仮定します)。

クエリが遅いのは、後でインデックスを追加したことが原因ではありません。何か別の理由があるでしょう。

于 2012-08-12T20:25:06.907 に答える