2

このクエリは、結果を生成するのに時間がかかりすぎます。そしてphpページで500内部サーバーエラーを作成します。

SELECT DISTINCT tower_mac_address AS MAC_Address, tower_survey_no AS Survey_No 
FROM tower 
WHERE 
SUBSTR(REPLACE(tower_mac_address,':',''),7,6) 
NOT IN 
    (SELECT DISTINCT deviceid FROM device_data 
    WHERE SUBSTRING(date_time,1,10)=CURRENT_DATE)

助けてください

4

4 に答える 4

3

あなたのクエリは本当に悪いです。SUBSTR(REPLACE ..... を使用しているため、tower_mac_address 列でインデックスを使用することはできません。その内部クエリの同様の状況では、SUBSTR があります... 再び。それを行う代わりに、その SUBSTR を持つ新しい列を準備することができます(REPLACE... 既に、その列にインデックスを追加します。

ところで、その内部の WHERE に使用する必要がある値を計算するときは、SUBSTRING を実行して datetime の日付部分を取得する代わりに、DATE()関数を使用します。

于 2012-08-18T13:08:03.447 に答える
0

これを試して

SELECT DISTINCT tower_mac_address AS  MAC_Address, tower_survey_no AS Survey_No 
FROM tower LEFT JOIN
(SELECT DISTINCT deviceid FROM device_data WHERE SUBSTR(date_time,1,10)=CURRENT_DATE) d ON SUBSTR(REPLACE(tower_mac_address,':',''),7,6) = d.deviceid
WHERE d.deviceid IS NOT NULL

   

于 2012-08-18T13:25:24.017 に答える
0

substringあなたは間違いなくサブクエリで取り除くことができます:

SELECT DISTINCT deviceid FROM device_data 
WHERE SUBSTRING(date_time,1,10)=CURRENT_DATE;

--is the same as 
SELECT DISTINCT deviceid FROM device_data
WHERE `date_time` >=CURRENT_DATE AND `date_time`<CURRENT_DATE+INTERVAL 1 DAY;

ただし、2番目のクエリはdate_time列のインデックスを使用できます。

于 2012-08-18T13:18:00.093 に答える
0

あなたの問題はNOT INです。MySQL は、これを最適化するという非常に貧弱な仕事をします。少なくともドキュメントの種類はこれを説明しています。

SELECT DISTINCT tower_mac_address AS MAC_Address, tower_survey_no AS Survey_No 
FROM tower t
WHERE  not exists
       (select 1
        from device_data dd
        where dd.deviceid = SUBSTR(REPLACE(t.tower_mac_address,':',''),7,6) and
              SUBSTRING(date_time,1,10)=CURRENT_DATE
       )

追加の推奨事項は次のとおりです。

  1. サブクエリを高速化するには、device_data.deviceid にインデックスを作成します。
  2. date_time を文字列ではなく日時データ型として保存します。このように、CURRENT_DATE との比較には、暗黙的な変換は含まれません。
  3. 「tow_mac_address」にエンコードされた情報が含まれている場合は、それを別のフィールドに分割することを検討してください。
于 2012-08-18T16:22:53.267 に答える