2010-12-20 6 views
1

私はテーブルAとテーブルBの2つのテーブルを持っています。 テーブルAは100万レコードと4フィールドを含み、テーブル2は60000フィールドと3フィールドを含んでいます。 私はこれらの2つのテーブルを結合し、 '%Bags%'のような特定の製品や 'Bags%' e.t.cのような製品を見つけるためにWHERE句を使用するクエリを実行しています。MySQLクエリ/データベースを最適化する

phpMyAdminで直接クエリを実行すると、約1〜2秒でレコードが返されます。しかし、彼らがウェブサイトで使用されているときには、MySQLの「低速クエリ」ログに応じて9秒または10秒かかることがあります。実際、私のウェブサイトの応答は非常に遅かったので、調査の結果、MySQLのために「遅いクエリログ」について知るようになったことが分かりました。

低速クエリログは、実行にlong_query_time秒以上かかり、少なくともmin_examined_row_limit行を調べる必要があるすべてのSQL文で構成されています。

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

両方のテーブルでは、インデックスと同様にPRIMARYキーが使用されています。だから私はそれらをもっと最適化する方法やMySQLの設定を一般的に最適化する方法があるのか​​知りたいですか?

ウェブサイトのこの遅さは、常に発生するのではなく、時には(1週間に1回でもよい)約1〜2分間続きます。それはまともな量のトラフィックを取得し、他にも多くのクエリがあります。私が投稿した上記の例は単なる例です。理由はいくつかの他のクエリの

おかげ

答えて

4

http://www.mysqlperformanceblog.com/

をチェックアウトし、クエリ診断ツールとして、EXPLAINの使用方法の情報のためherehereを参照して、EXPLAINでクエリを確認してください。

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

これは、MySQLサーバーの設定が適切でないこと、サーバーの調整が不適切であること、スキーマが悪いことなど、他にも多くのことがあります。しかし、あなたの質問とあなたのインデックスはあなたの調査を開始するのに適しています。

Hereは、MySQLのJay Pipesのパフォーマンスに関するベストプラクティスの要約です。

+0

また、他の人からもわかるように、サイトのトラフィックに応じて掲載結果が異なります。オフピーク時にphpMyAdminでクエリを実行している場合は、ピーク時にクエリを実行している場合よりもパフォーマンスが向上します。 –

0

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

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

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

ちょうどそれをチェックしてください。

ありがとうございました。

1

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

パフォーマンスを改善する唯一の方法は、fulltext indexesを使用するか、sphinxを検索して検索することです。すべての物事のMySQLとパフォーマンス関連については

+0

はいこの列には既にFULLTEXTインデックスが使用されています。 – Ali

+1

@Ali:「MATCH ... AGAINST」を使って検索してみませんか? – zerkms

0

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

ルック、それは意味が最も多い

を作るかどうかを確認し、データベースが悪いのデザインを持っており、正規化されません。これは、データベースの速度に大きな影響を与える可能性があります。一般的なケースとして、3つの標準形を学び、それらを常に適用してください。 3番目の正規形より上の正規形は、しばしば正規化解除形式と呼ばれますが、これは実際には、データベースをより高速にするためにいくつかの規則を破るということです。

私が提案するのは、DBA(後続のフォームを知っていて、何をやっているのかを知っていることを意味する)を除いて、3番目の通常のフォームに固執することです。 3番目のNF後の正規化は、しばしば設計中ではなく、後で行われます。

あなただけが本当に可能な限り

として

フィルターを必要とするものを照会あなたの句は最適化のための最も重要な部分です。

を選択します

を必要とするだけのフィールドは「*選択」は絶対に使用しないでください - あなたが必要なフィールドのみを指定します。それはより速く、より少ない帯域幅を使用します。

参加するには注意してください、時間の面で高価で参加。 2つのテーブルを関連付けるすべてのキーを使用し、使用されていないテーブルには参加しないでください。常にインデックス付きフィールドに参加してください。結合タイプも重要です(INNER、OUTER、...)。

最適化クエリやストアドプロシージャ(ほとんどの最初に実行する)

クエリは非常に高速です。一般に、ジョイン、ソート、計算を行っても、1秒以内に多くのレコードを取得できます。経験則として、クエリが1秒よりも長い場合は、おそらくそれを最適化できます。

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

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

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

特に、整数、ブール値、および数値にインデックスを使用したいとします。一方、Blob、VarChars、Long Stringsではインデックスを使用したくないかもしれません。

インデックスを追加する際には、データベースによってメンテナンスが必要なので注意してください。そのフィールドで多くの更新を行うと、索引の保守に時間がかかることがあります。

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

ストアドプロシージャ(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). 

不要なビューを削除します

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

いつも同じ情報が必要な場合は、表示がうまくいく可能性があります。

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

チューンDBは多くの点であなたが調整できる

DBを設定します。オプティマイザが使用する統計を更新し、最適化オプションを実行し、DBを読み取り専用にするなど...これは、使用するDBの幅広い知識を必要とし、主にDBAによって行われます。クエリアナライザを使用して

は****> ****多くのデータベースに

は、実行中のクエリを最適化するためのツールがあります。 SQL Serverにはクエリアナライザと呼ばれるツールがあり、これは最適化に非常に役立ちます。クエリを記述して実行し、さらに重要なことは実行計画を見ることができます。この実行を使用して、SQL Serverがクエリをどのように処理するかを理解します。