2012-03-27 5 views
0

私は150万以上のレコードを持つデータベースを使用するウェブサイトを持っています。今私はウェブホスティング会社がしばらくの間、私のサイトを中断するポイントに達した。理由は、サーバーに対して実行される照会がシステムに過負荷をかけるためです。どうすれば解決できるかアドバイスしてください!私はデータベースの問題について奨励が必要です

クエリ例:

SELECT id,a,b,c,d,e,f 
FROM table 
WHERE a LIKE '%GHEORGHE%' OR b LIKE '%GHEORGHE%' 
    OR c LIKE '%GHEORGHE%' OR a LIKE '%GHE.%' OR b LIKE '%GHE.%' 
    OR c LIKE '%GHE.%' OR a LIKE '%AURELIA%' 
    OR b LIKE '%AURELIA%' OR c LIKE '%AURELIA%' OR a LIKE '%PERSOANA%' 
    OR b LIKE '%PERSOANA%' OR c LIKE '%PERSOANA%' OR 0) 
    AND id != $id 
ORDER BY f ASC 
LIMIT 10 

このクエリは2秒で実行されます。

+0

あなたの質問を共有して、多分最適化することができます。 – slash197

+0

より強力なサーバーを購入するか、クエリを最適化してください。 – JJJ

+0

が質問を編集しました。 –

答えて

2

相対的に、150万レコードはまったく大きくありません。問題は、LIKE '%word%'という節が処理上非常に高価であることです。特に、フィールドがTEXTフィールドであり、索引付けされていない場合可能であれば

  • 可能であれば、すべてのフィールドのインデックスを作成するには、WHERE条件を簡素化し、
  • 検索しました。たとえばLIKE '%GHE。%'はLIKE '%GHE%'に変更されている可能性があります。また、LIKE '%GHE%'が既に検索条件を満たす場合は、LIKE '%GHEORGHE%'は不要です。

[私はあなたの質問の終わり近くにあると仮定していますが入力ミス]

5

専用サーバーを購入します。

+0

(予算に応じて、今削除されたVPSに対するコメントに対応)True。いずれにしても、重要な点は、共有サーバーが、その大きなデータベースを使用するアプリケーション用に設計されていないことです。 –

+0

これは、クエリの一部を見ることなく与えられる最良のアドバイスです。 – Pete

+0

完全にあなたに同意します。 – GuZzie

1

クエリがむしろ非効率的であるようです。ジョインを実行したり、頻繁に変更されることのないデータをキャッシュしたり、データを収集して使用する方法を少し巧妙にするだけで、不必要な作業を避けることができますクエリ。

1

場合によっては、テーブルを分割してクエリを縮小する可能性があります。たとえば、特定の国または特定のページのユーザーが特定の基準を満たすレコードまたは特定のプロパティを持つレコードしか必要としない場合は、事前にそれらを適切なテーブルにポイントして、行のサイズを縮小することができますからの質問。

これは一般的な考え方ですが、実際にあなたがやっていることに依存します。

0

構文的に正しいものではないため、そのクエリはまったく実行されません。

私はデータベース最適化の専門家ではありませんが、これらのワイルドカードはすべて時間がかかります。 DBクエリーの実行条件では、2秒が有効です。 id!= $ idを持つことは、チェックするのに非常に集中的な条件です。

編集:a、bなどにインデックスがありますか?彼らはスピードに大きな違いを生むことができます。 "OR"を複数指定すると、クエリが遅くなります。多分これを複数のクエリに分解し、PHPを使って何をしたいのですか?

関連する問題