0

何千もの行があるテーブルでクエリを実行しています:

$sql="select * from call_history where extension_number = '0536*002' and flow = 'in' and DATE(initiated) = '".date("Y-m-d")."' ";

結果を返すのに永遠に時間がかかります。

SQL自体は

 select * 
   from call_history 
  where extension_number = '0536*002'
    and flow = 'in' 
    and DATE(initiated) = 'dateFromYourPHPcode'

より速く実行する方法はありますか?where句DATE(initiated) = '".date("Y-m-d")."'の前にwhereを置くべきですか?extension_number

または、すべての行を選択DATE(initiated) = '".date("Y-m-d")."'して while ループに入れてから、while ループ内で他のすべてのクエリを実行する(where extension_number = ...)必要がありますか?

4

3 に答える 3

1

以下にいくつかの提案を示します。

1) 必要なフィールドのみに置き換えSELECT *ます。

2) 出力として必要なテーブル フィールドにインデックスを追加します。

3) クエリをループで実行しないようにします。これにより、SQL サーバーへの複数の要求が発生します。

4) 一度にすべてのデータを取得します。

5)LIMIT必要に応じてタグを適用します。すべてのレコードを選択しないでください。

6) 2 つの異なるクエリを起動します。1 つはレコードの総数をカウントするためのもので、もう 1 つはページあたりのレコード数を取得するためのものです (例: 10、20、50 など)。

7) 該当する場合は、データベース ビューを作成し、テーブルの代わりにそれらからデータを取得します。ありがとう

于 2013-09-30T11:12:41.630 に答える
1

以下の句の順序はWHERE、最適化には関係ありません。

他の誰かからも提案されたプロのヒント:SELECT *正当な理由がない限り、プログラムのクエリで使用しないでください。「必要な列の名前を書き出す気がしない」というのは正当な理由ではありません。常に必要な列を列挙してください。MySQL やその他のデータベース システムは、必要なデータ列のリストが利用できる場合、驚くべき方法で物事を最適化できることがよくあります。

クエリには、この選択基準が含まれています。

AND DATE(initiated) = 'dateFromYourPHPcode'

この検索基準は次の形式を取ることに注意してください。

FUNCTION(column) = value

この形式の検索では、その列のインデックスを使用できません。列initiatedにはTIMESTAMPデータ型があります。代わりにこれを試してください:

 AND initiated >= 'dateFromYourPHPcode'
 AND initiated <  'dateFromYourPHPcode' + INTERVAL 1 DAY

これにより、特定の日のすべてのinitiatedアイテムが検索されます。また、列値に対して関数を使用しないため、インデックス レンジ スキャンを使用してそれを行うことができ、これはうまく機能します。インデックスがなくても役立つ場合とそうでない場合があります。それは試みに値します。

この特定の検索の理想的なインデックスは、

 ALTER TABLE call_history 
   ADD INDEX flowExtInit (flow, extension_number, initiated)

クエリに優れたパフォーマンスが必要な場合は、データベースの管理者にこのインデックスを追加するよう依頼する必要があります。

于 2013-09-30T11:38:50.493 に答える
0

テーブルにインデックスを追加する必要があります。このようにして、MySql はより高速にフェッチされます。私はテストしていませんが、コマンドは次のようになります。

ALTER TABLE `call_history ` ADD INDEX `callhistory` (`extension_number`,`flow`,`extension_number`,`DATE(initiated)`);
于 2013-09-30T11:13:55.603 に答える