0

何百万ものレコードを持つMySqlテーブルをクエリするSQLがあります。これは phpMyAdmin では約 2 秒で実行されますが、PHP スクリプトから実行すると実行が完了しません。

select 
  concat(p1.`Date`," ",p1.`Time`) as har_date_from,
  concat(p2.`Date`," ",p2.`Time`) as har_date_to,
 (select concat(p3.`Date`," ",p3.`Time`) from 
   power_logger p3 
   where p3.slno between 1851219 and 2042099
   and p3.meter_id="logger1"
   and str_to_date(concat(p3.`Date`," ",p3.`Time`),"%d/%m/%Y %H:%i:%s") >=
       str_to_date(concat(p1.`Date`," ",p1.`Time`),"%d/%m/%Y %H:%i:%s")

   order by p3.slno limit 1) as cur_date_from,
     (select concat(p4.`Date`," ",p4.`Time`) from
        power_logger p4 
        where p4.slno between 1851219 
        and 2042099
        and p4.meter_id="logger1" 
        and str_to_date(concat(p4.`Date`," ",p4.`Time`),"%d/%m/%Y %H:%i:%s") >=
            str_to_date(concat(p2.`Date`," ",p2.`Time`),"%d/%m/%Y %H:%i:%s")
        order by p4.slno 
        limit 1
      )
      as cur_date_to, 
      p1.THD_A_N_Avg-p2.THD_A_N_Avg as thd_diff
      from power_logger p1
    join 
      power_logger p2 
        on p2.slno=p1.slno+1 
        and p1.meter_id="fluke1" 
        and p2.meter_id=p1.meter_id
        and p1.slno between 2058609 and 2062310 
        and p1.THD_A_N_Avg-p2.THD_A_N_Avg>=2.0000

PHP スクリプト: $query=/*The query above passed as string*/ $mysql=mysql_connect('localhost','username','pwd') or die(mysql_error()); mysql_select_db('dbname',$mysql); $rows=mysql_query($query,$mysql) or die(mysql_error());

他の多くのクエリを正常に実行しているため、mysql 接続および関連するものに問題はありません。meter_id と Date,Time に一緒にインデックスを設定しました。slno は自動インクリメント値です。私の調査から多くのことを見つけたので、同様の質問があることは知っていますが、どれも実際には役に立ちませんでした。誰かが解決策を見つけるのを手伝ってくれたら、前もって感謝します。

クエリの説明: これは、何百万ものレコードを含む power_logger テーブルにクエリを実行し、THD_A_N_AVG、meter_id、slno、Date、および Time をテーブルの列に含めます。これにより、THD_A_N_AVG の差が 2 以上である範囲の slno を持つ 2 つの連続する行から日付と時刻が選択されます。ここで、日付と時刻は、以前にフェッチされたものに最も近いため、har_date_from、har_date_to、cur_date_from、cur_date_to を形成します。ここで混乱しているのは、ネストされた選択です。

4

1 に答える 1

1

通常、PHPMyAdmin はクエリの末尾に「LIMIT 0, 30」を自動的に追加するため、一度に 30 行しかロードできません。コードでは、すべてを一度にロードしようとしているため、時間がかかります。

于 2013-10-28T04:18:35.800 に答える