1

テーブル A とテーブル B の 2 つのテーブルがあります。テーブル A には 100 万 (1,000,000) レコードと 4 つのフィールドが含まれ、テーブル 2 には 60,000 と 3 つのフィールドが含まれます。これら 2 つのテーブルを結合し、WHERE 句を使用して「%Bags%」などの WHERE 製品や「Bags%」などの製品などの特定の製品を検索するクエリを実行しています。

クエリを phpMyAdmin で直接実行すると、約 1 ~ 2 秒でレコードが返されます。しかし、それらが Web サイトで使用されている場合、MySQL の「スロー クエリ」ログによると、9 秒または 10 秒かかることがあります。実際、私のウェブサイトの応答は時々非常に遅かったので、調査の結果、'slow query log' について知り、MySQL が原因であることがわかりました。

スロー クエリ ログは、実行に long_query_time 秒以上かかり、少なくとも min_examined_row_limit 行の検査が必要なすべての SQL ステートメントで構成されます。

したがって、そのログによると、上記のクエリの「query_time」は 13 秒でしたが、場合によっては「query_time」が 50 秒を超えていました。

私のテーブルは両方とも、主キーと INDEXES を使用しています。それで、それらをさらに最適化する方法を知りたいですか、それとも一般的にMySQL設定を最適化する方法はありますか?

この Web サイトの遅さは常に発生するわけではありませんが、ときどき (1 週間に 1 回程度)、約 1 ~ 2 分間続きます。それはかなりの量のトラフィックを取得し、他にも多くのクエリがあります。私が投稿した上記はほんの一例です.

ありがとう

4

4 に答える 4

4

MySQL とパフォーマンス関連のすべてについては、http://www.mysqlperformanceblog.com/ をご覧ください。

EXPLAIN を使用してクエリを確認します。EXPLAIN をクエリ診断ツールとして使用する方法については、こちらこちらを参照してください。

インデックスだけでは不十分です。WHERE 句で検索されたフィールドにインデックスを付けていますか? また、WHERE 句で使用されるフィールド (ORDER BY、GROUP BY、HAVING 句、および JOIN で言及されているフィールドを含む) のインデックスはありますか? 単一のインデックスでフィールドをグループ化した場合、それらすべてのフィールドを一緒に検索するクエリがない限り、そのインデックスはヒットしません。インデックス内のフィールドをグループ化する場合は、それらのインデックスが実際にクエリで使用されることを確認してください (EXPLAIN はあなたの友達です)。

とはいえ、他の多くのことも考えられます: MySQL サーバーの構成が不十分、サーバーの調整が不十分、スキーマが不適切などです。ただし、クエリとインデックスは、調査を開始するのに適した場所です。

これは、MySQL の Jay Pipes によるパフォーマンスのベスト プラクティスの優れた要約です

于 2010-12-20T06:00:48.143 に答える
1

like '%Bags%'インデックスを使用してクエリを最適化することはできません。

ここでパフォーマンスを向上させる唯一の方法は、フルテキストインデックスを使用するか、スフィンクスを検索することです。

于 2010-12-20T05:45:30.543 に答える
0

それはあなたがあなたのウェブサイトのページを更新しようとしているときに他のいくつかのクエリが実行されるためです。したがって、たとえば、ページの更新時にWebサイトで8〜10のクエリを実行する場合は、で単一のクエリを実行するよりも時間がかかりますphpmyadmin。実行に1〜1.5分かかる場合は、クエリの問題ではない可能性がありますが、サーバーの速度にも問題がある可能性があります。

MATCH() AGAINST()また、ステートメントを使用して、このタイプの検索クエリを最適化することもできます。

それ以外の場合はすでに使用してPRIMARY KEY, INDEXES and JOINSいるので、他のことを心配する必要はありません。

ただそれをチェックしてください。

ありがとう。

于 2010-12-20T05:45:24.440 に答える
0

データベースとクエリを最適化する方法はたくさんあります。私の方法は次のとおりです。

DBスキーマを見て、意味があるかどうかを確認してください

ほとんどの場合、データベースは設計が悪く、正規化されていません。これは、データベースの速度に大きく影響する可能性があります。一般的なケースとして、3 つの正規形を学習し、常に適用します。第 3 正規形より上の正規形は、非正規形と呼ばれることがよくありますが、これが実際に意味することは、データベースを高速化するためにいくつかの規則に違反していることです。

私が提案するのは、DBA である場合を除いて、第 3 正規形に固執することです (つまり、後続の正規形を知っていて、自分が何をしているのかを知っているということです)。3 番目の NF の後の正規化は、多くの場合、設計時ではなく後で行われます。

本当に必要なものだけを照会する

可能な限りフィルタリングする

Where句は、最適化にとって最も重要な部分です。

必要なフィールドのみを選択してください

「Select *」は使用しない -- 必要なフィールドのみを指定します。より高速になり、使用する帯域幅が少なくなります。

結合に注意してください

結合は時間の面でコストがかかります。2 つのテーブルを関連付けるすべてのキーを使用し、未使用のテーブルに結合しないようにしてください。常にインデックス付きフィールドで結合するようにしてください。結合タイプも重要です (INNER、OUTER、...)。

クエリとストアド プロシージャを最適化する (Most Run First)

クエリは非常に高速です。通常、結合、並べ替え、計算を使用しても、多くのレコードを 1 秒以内に取得できます。経験則として、クエリが 1 秒よりも長い場合は、おそらく最適化できます。

最も頻繁に使用されるクエリと、実行に最も時間がかかるクエリから始めます。

インデックスの追加、削除、または変更

クエリがフル テーブル スキャンを実行する場合、インデックスと適切なフィルタリングにより、通常は非常に時間のかかるプロセスを解決できます。結合を高速化するため、すべての主キーにインデックスが必要です。これは、すべてのテーブルに主キーが必要であることも意味します。Where 句でのフィルタリングによく使用するフィールドにインデックスを追加することもできます。

特に、整数、ブール値、および数値でインデックスを使用したい場合。一方、Blob、VarChar、Long String ではインデックスを使用したくないでしょう。

インデックスはデータベースによって維持される必要があるため、インデックスの追加には注意してください。そのフィールドで多くの更新を行うと、インデックスの維持に時間がかかる可能性があります。

インターネットの世界では、読み取り専用テーブルは非常に一般的です。テーブルが読み取り専用の場合、インデックスを維持する必要がない (またはほとんど維持する必要がない) ため、悪影響が少ないインデックスを追加できます。

クエリをストアド プロシージャ (SP) に移動

通常、ストアド プロシージャは、次の理由により、クエリよりも優れており、高速です。

Stored Procedures are compiled (SQL Code is not), making them faster than SQL code.
SPs don't use as much bandwidth because you can do many queries in one SP. SPs also stay on the server until the final results are returned.
Stored Procedures are run on the server, which is typically faster.
Calculations in code (VB, Java, C++, ...) are not as fast as SP in most cases.
It keeps your DB access code separate from your presentation layer, which makes it easier to maintain (3 tiers model).

不要なビューを削除

ビューは特殊なタイプのクエリであり、テーブルではありません。それらは論理的で物理的ではないため、 select * from MyView を実行するたびに、ビューを作成するクエリとビューに対するクエリを実行します。

常に同じ情報が必要な場合は、ビューが適している可能性があります。

ビューをフィルタリングする必要がある場合は、クエリに対してクエリを実行するようなもので、処理が遅くなります。

DB 設定のチューニング

DB はさまざまな方法で調整できます。オプティマイザーが使用する統計の更新、最適化オプションの実行、DB の読み取り専用化など...これには、使用する DB に関する幅広い知識が必要であり、ほとんどの場合 DBA によって行われます。

****> クエリ アナライザーの使用****

多くのデータベースには、クエリを実行および最適化するためのツールがあります。SQL Server には、最適化に非常に役立つクエリ アナライザーと呼ばれるツールがあります。クエリを作成して実行し、さらに重要なことに、実行計画を確認できます。実行を使用して、SQL Server がクエリで何を行うかを理解します。

于 2015-04-20T07:47:42.533 に答える