0

データベースからデータをクエリしていますが、クエリ句は日によって異なります。つまり、UNIXタイムスタンプの秒数をカウントして、1日単位でデータを取得したいと考えています。

だから、私が一日のクエリのためにしたことは、

SELECT IDnum, Timestamp FROM table_name
WHERE CONVERT(Timestamp, UNSIGNED INTEGER) >= ($start_tim-86400*($i+1))
  AND CONVERT(Timestamp, UNSIGNED INTEGER) < ($start_time-86400*$i)

テーブルのTimestamp属性はvarchar(32)であるため、where句でCONVERT()を使用してintに変換し、86400のint型と比較しました。

このクエリ句はこれまでのところ機能しますが、ini_set('max_execution_time'、300)を設定するのに少なくとも5分かかります。そして5分後、「致命的なエラー:90行目のC:\ www \ LineChartOne \ generateJSONdata.phpで最大実行時間が420秒を超えました」と表示されましたが、まだ完了していません。

私の質問は、なぜこれほど時間がかかるのか、そして「where句」で関数呼び出しを使用したのでしょうか。または、「where句」に問題があります。そうでない場合は、実行速度が遅くなることはありません。

4

3 に答える 3

1

CONVERT()は非常に非効率的だと思います。UNIX_TIMESTAMP()またはFROM_UNIXTIME()または またはのような日付関数を使用して、日付を比較します。DATE_SUB()DATE_DIFF()

それでも永遠にかかる場合は、何か問題があり、何千万行も持っていない可能性があります。

  1. あなたの PHP コードは非効率的です。
  2. このクエリには、表示しているもの以上のものがあります。
  3. Web サーバーや MySQL サーバーに、他のユーザーからの負荷がかかっています。

編集:

甘いイエス、あなたのコメントのコードは私の脳をかゆくさせます. また、あなたのTimestamp列が TIMESTAMP ではなく VARCHAR であることにも気付きました。悪いユーザー。数値や日付を文字列として保存しないでください。隅に座ってください。

  • オプション 1: INT にします。[既存のコードで動作]
  • オプション 2: DATETIME にします。[一般的により柔軟]

あなたが得ていないもの:

  1. FROM_UNIXTIME()整数のタイムスタンプをDATETIME型に変換します。文字列をフィードすると、暗黙的な変換が行われます。[コンバージョンが遅い]
  2. UNIX_TIMESTAMP()日付文字列、DATEまたはを取りDATETIME、整数を返します。

指定したコードはUNIX_TIMESTAMP(FROM_UNIXTIME(Timestamp))、文字列を int に変換し、日付を int に戻します。ドキュメントはこちらにあります。それを読んでください。

クエリに非常に時間がかかる理由の大部分は、mySQL がすべての値をTimestampからVARCHARに変換する必要があるためINTEGERです。列のタイプを変更すると、単純な整数比較を行うことができます。これにより、世界が高速化されます。

$start_time-86400*($i+1)PHPで式を事前に計算することで、パフォーマンスの向上を大幅に抑えることができます。mySQL1 回だけ評価するように最適化する必要がありますが、クエリがより複雑になり、行ごとにこれを計算し始めると、オプティマイザーは奇妙なことを行う可能性があります。

于 2012-11-14T17:52:44.187 に答える
0

mysql クエリ パーサーはこれらの列の変換に苦労しています。格納する値に正しいデータ型を使用する必要があります。つまり、int には int、文字列には varchar、datetime などです。

于 2012-11-14T18:57:03.063 に答える
0
ini_set('max_execution_time', 300); //300 seconds = 5 minutes

これを PHP スクリプトの先頭に配置して、スクリプトを解き放ちます。

「ini_set() を使用して PHP スクリプトの実行時間制限を引き上げる」から取得

于 2016-02-17T15:30:58.797 に答える