2012-03-06 7 views
1

に私はnginxの、FastCGIのとMySQLこのmysqlクエリを最適化する方法は? nginxのおよびFastCGI

私は、配当テーブルを持っているの上にコードイグナイタフレームワーク上に構築されたWebアプリケーションを持っています。テーブル構造はhereです。

この表では、国名、perminutecost対が格納されており、その上に約56,373レコードが格納されています。メインページで


、ここ

に私は、ユーザーの種類としてオートコンプリート機能を使用していますperminute cost.Btwを取得するために彼の携帯電話番号を入力するようにユーザーに要求したフォームは、私のバックエンドのコードがあるされています。

$ strのは、ユーザの入力(携帯電話番号)

$ RET =真を保持しています。 $ count = 3;

 while($ret){ 
      $sub = substr($str,0,$count); //9053 
      $ret = R::getAll("SELECT Destination,PerMinuteCost FROM `payout` WHERE `Prefix` REGEXP '^$sub(.)*$' LIMIT 0 , 30"); 
      $count++; 
     } 

     $sub = substr($str,0,$count-2); 

     $ret = R::getAll("SELECT Destination,PerMinuteCost FROM `payout` WHERE `Prefix` REGEXP '^$sub(.)*$' LIMIT 0 , 30"); 

     return $ret[0]; 

このコードは、私は携帯電話の番号からperminutecost取得することができます。(表だけでなく、すべての携帯電話番号を接頭辞保持している)私はnginxのおよびFastCGIにいくつかの変更がタイムアウト制限

を拡張することでした

が、あまりにも多くの人々が同時にサービスを使用し、mysqldのCPU使用率が100%以上を取得している、

どのように私はこのアルゴリズムを改善するだろうか?

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

+1

は、オートコンプリートのためREGEXですか?私はすぐにそれを削除するので。 – Woot4Moo

+0

:)これは私の高速生産コードです。今私は最適化を探しています。 –

+0

ユーザーが入力するサンプルを投稿できますか?彼らは '01'、次に '012'とタイプすることを提案していますか? – tristanbailey

答えて

3

私はちょうど '$ sub%'は正規表現よりも速く、3つの数字までオートコンプリートしていない方があなたのデータベースにとっては良いかもしれないと思います。

このスクリプトの外でsqlの先頭に "EXPLAIN"を置くと、いくつかのSQL出力例がポストされます。

+1

フォームの最後に入力された値にいくつかの種類のキャッシュを追加すると、最も一般的な検索がより速くなる – tristanbailey

+0

これはnginxで行うべきですか? –

+0

nginxとMySQLの関係は? –

3

プレフィックスのプレフィックスを格納する別のテーブルを作成することができます。たとえば、ペイアウトテーブルのエントリに接頭辞= 12345がある場合、接頭辞テーブルに関連付けられた行は1、12、123、1234、および12345です。各エントリは、外部キーによって元のレコードにリンクされます。検索するには、prefixTableで正確に一致するものを見つけて、支払いテーブルに戻って支払い情報を取得します。

これはもちろん、サーバー上でより多くのスペースを使いますが、大幅なスピードアップをもたらすはずです。

1

PrefixカラムをTEXTからVARCHARカラムに最小必要長さに変換し、Prefixカラムにインデックスを追加します。

その後、代わりに正規表現を使用しての、%ワイルドカードでLIKEを使用します。

SELECT Destination, PerMinuteCost 
FROM `payout` WHERE `Prefix` LIKE '$sub%' 
LIMIT 0 , 30 
+0

素晴らしい!それを行うでしょう! –

+0

すべての数値が同じ長さ(またはそれに類するもの)の場合は、すべてのvarchar行が最長エントリのデータ長として格納されるため、intカラムがvarcharよりも必要な場合があります。スペースを必要としない限り、間違ってキャラクターを入力したくないのですか? – tristanbailey

+0

@tristanbaileyでは、VARCHAR値は最長エントリのデータ長として格納されません。それはインデックスにも当てはまらない。 VARCHAR列は、最初の1〜2バイトを使用して、各行の値の長さを格納します。残りは実際には可変長で、値にマッチします。 –