2016-11-23 8 views
0

このクエリは、現在数千の行がある信頼性の低い小さなテーブルからのヒントリスト(ヒント)を返します。しかし、それは非常にゆっくりとヒントを返すので非常に便利です。他の質問のほとんどは、減速がどこにあるのかDBをポーリングすることを示唆しています。私は本当にそれを行うために必要なレベルでアクセス権を持っていません。現在、以下のようになっていますが、誰かが私に知られていない技術を見せてくれるかもしれません。私は本当に次のクエリをスピードアップしたいと思います。MySQLをより効率的に動作させるには?

$stmt = $db_found->prepare("SELECT DISTINCT callsign, Fname, ID, grid, 
           tactical, latitude, longitude, email, Lname 
     FROM NetLog 
     WHERE recordID IN (SELECT max(recordID) 
     FROM NetLog 
     WHERE callsign LIKE ? 
     AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD') 
     GROUP BY callsign)"); 

これにより、最新のバージョンのrecordIDがプルアップされます。 recordIDは、この表の自動インクリメント変数です。私が最初のFROMとWHEREを削除すると、クエリはもっと​​速く実行されます。ここのような;

$stmt = $db_found->prepare("SELECT DISTINCT callsign, Fname, ID, grid, tactical, latitude, 
              longitude, email, Lname, recordID 
     FROM NetLog 
     WHERE callsign LIKE ? 
     AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD') 
     GROUP BY callsign"); 

問題は、これが最新のレコードであるという保証はありません。

私はリターンをスピードアップできますが、このコールサインの最新のrecordIDを取得していることを確認するにはどうすればよいですか?

答えて

2

実行計画と実際の動作を確認することに加えて、あなたはデータに近づくことを試みることができ、異なる

あなたは代わりにIN句の動の(一時)表を使用して試みることができる

$stmt = $db_found->prepare(" 
SELECT DISTINCT 
    callsign 
    , Fname 
    , ID 
    , grid 
    , tactical 
    , latitude 
    , longitude 
    , email 
    , Lname 
FROM NetLog 
INNER JOIN ( 
    SELECT max(recordID) as recordID 
    FROM NetLog 
    WHERE callsign LIKE ? 
    AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD') 
    GROUP BY callsign 
) t1 on t1.recordID = NetLog.recordID;"); 
+0

私はこれの音が気に入っていますが、動作する構文を取得するのに問題があります。私は正確にエラーを取得しませんが、私は私のエディタで構文が検証されないことがわかります。 ? –

+0

@KeithDKaiser。これは二重引用符で囲む必要があります(また、;によって更新されました。更新された.. – scaisEdge

+0

私はまだこのようなエラーを受け取ります:#1054 - 'on clause'の 't1.recordID'列が不明です。 –

0

クエリを1に制限し、結果をORDER BY recordID DESC LIMIT 1でソートします。この方法では、テーブルの内容全体を返す必要はありません。

+0

'LIMIT'はテーブルスキャンを防止しません。 'LIMIT 1'を実行すると、MySQLはテーブル全体をスキャンします。 'LIMIT'の仕組みを読んでください。 –

+0

はい、あなたはN.B.です。クエリの結果を最適化します。 –

0

の場合クエリを最適化したい場合は、常に問題があるかどうかを判断する計画です。explain私が推測するところでは、コールサインフィールドのインデックスの欠如です。 LIKE演算子を使用しているので、おそらくfull text indexを使用します。 DISTINCTは、すでにサブクエリにGROUP BYがあるため、このクエリでは不要です。

関連する問題