2

私はこのユニオンクエリを持っています:

(SELECT INSTALLER, INSTALLTIME, RESULT, JOBNUMBER, HONAME, ADDRESS, CITY, STATE, ZIP, NOTES, SMNOTES, '' as priority, PAFS, upsell, TERM, MMRUPGRADE, WARRANTY, EFT FROM ACCOUNTS 
WHERE INSTALLDATE = '$date' && FUNDINGSTATUS !='DEAD') 
UNION 
(SELECT technician, servicetime, result, ID, Customername, address, city, state, zip, notes, board, priority, '', '', '', '', '', '' FROM service 
WHERE serviceday = '$date') 
ORDER BY INSTALLER, priority

日付フィールドにインデックスを付けることが両方のクエリを高速化するのに役立つかどうか知りたいですか?または、最初のwhere句でFUNDINGSTATUSを使用すると、そのクエリでインデックスが使用されなくなりますか?

4

3 に答える 3

3

ほとんどの場合、それは役立つでしょうが、確実にする唯一の方法は、プロファイラーを壊して開いて、見てみることです。バージョン5.0.37以降、MySQLにはプロファイラーが組み込まれています。

で有効にする

set profiling=1;

query_idを検索するには

show profiles;

そして、実行計画を確認するには:

show profile for query x;
于 2009-10-12T14:30:03.607 に答える
2

あなたの質問に答える:

日付フィールドにインデックスを付けると、両方のクエリが高速化されるかどうか知りたいですか?

条件がオンinstalldate選択的servicedayである場合(つまり、それを満たす行が少ない場合)、はい、それは役に立ちます。

日付フィールドは通常、選択的である傾向があります。

またはFUNDINGSTATUS、最初のwhere句で使用すると、そのクエリでインデックスが使用されなくなりますか?

はい、インデックスは引き続き使用されます。

エンジンはインデックスを使用してレコードのみを選択installdate = $dateし、の値でさらにフィルタリングしますfundingstatus

最良の結果を得るには、次のインデックスを作成します。

ACCOUNTS  (installdate, fundingstatus)
service (serviceday)

DEADが頻繁に発生する値である場合は、次のfundingstatusようにこのクエリを書き直す方がよい場合があります。

SELECT  INSTALLER, INSTALLTIME, RESULT, JOBNUMBER, HONAME, ADDRESS, CITY, STATE, ZIP, NOTES, SMNOTES, '' as priority, PAFS, upsell, TERM, MMRUPGRADE, WARRANTY, EFT
FROM    ACCOUNTS 
WHERE   INSTALLDATE = '$date' AND FUNDINGSTATUS < 'DEAD'
UNION ALL
SELECT  INSTALLER, INSTALLTIME, RESULT, JOBNUMBER, HONAME, ADDRESS, CITY, STATE, ZIP, NOTES, SMNOTES, '' as priority, PAFS, upsell, TERM, MMRUPGRADE, WARRANTY, EFT
FROM    ACCOUNTS 
WHERE   INSTALLDATE = '$date' AND FUNDINGSTATUS > 'DEAD'
UNION
SELECT  technician, servicetime, result, ID, Customername, address, city, state, zip, notes, board, priority, '', '', '', '', '', ''
FROM    service 
WHERE   serviceday = '$date'
ORDER BY
        INSTALLER, priority

両方のフィールドの範囲アクセスを(installdate, fundingstatus)使用できるようにします。

于 2009-10-12T14:32:07.393 に答える
0

where句の任意のフィールドにインデックスを付けると、多かれ少なかれ、常にパフォーマンスを向上させることができます。

where句に「FUNDINGSTATUS」が含まれている最初のクエリにもかかわらず、「date」のインデックスが使用されるかどうかという質問に答えるには、次の2つの答えがあります。

  • テーブルに他のインデックスがない場合は、日付インデックスが最も確実に使用されます。これは、特定の日付のレコードをインデックスで検索する方が、テーブル全体を検索するよりもDBの作業がはるかに少ないためです。たとえ、レコードを検索した後でFUNDINGSTATUSを確認する必要がある場合でも同様です。

  • 同じテーブルに他のインデックスがある場合、答えは「状況によって異なります」です。

    これは主に、データの何%が、特定の日付のデータの%に対してノーテッドのデータになるかによって異なります。

    オプティマイザーは通常、列の最小数をすぐに選択するインデックスを選択しようとします。たとえば、テーブルに100日間のデータがあり、それらの1/2がデッド行である場合、日付インデックスが選択されます。テーブルをスキャンしない場合のデータの%とデータの50%。

于 2009-10-12T14:49:25.597 に答える