4

MySQLのDATETIME列を使用して日付と時刻を保存します。日付はUTCです。ある日からアイテムを選びたいです。私が今していること:

SELECT * FROM data WHERE DATE(CONVERT_TZ(datetime, 'UTC', 'Australia/Sydney')) = '2012-06-01'

タイムゾーンはユーザーによって異なることに注意してください

問題は、テーブルの成長が非常に遅いことです。それをより速くする方法はありますか?

4

4 に答える 4

10

現在、クエリはデータベースのすべての行の変換を計算する必要があります。逆に変換することで、変換が1回だけ(または範囲を形成する必要があるため実際には2回)行われるようにすることで、状況を改善できる可能性があります。次に、適切なインデックスをdatetime付けると、処理がかなり速くなります。

SELECT * FROM data
WHERE datetime BETWEEN CONVERT_TZ('2012-06-01 00:00:00', 'Australia/Sydney', 'UTC')
                   AND CONVERT_TZ('2012-06-01 23:59:59', 'Australia/Sydney', 'UTC')

または、うるう秒がどのクエリとも一致しないことを心配している場合は23:60:00、次のことができます。

SELECT * FROM data
WHERE datetime >= CONVERT_TZ('2012-06-01', 'Australia/Sydney', 'UTC')
  AND datetime < CONVERT_TZ('2012-06-01' + INTERVAL 1 DAY, 'Australia/Sydney', 'UTC')

後者の形式では、PHP側で時間を追加する必要はありませんが、代わりに文字列パラメーターとして日付を渡すことができます。

于 2012-08-01T08:22:30.530 に答える
1
  1. 選択しないでください *
  2. 索引付け - 適切な列/ID フィールドが索引付けされていることを確認してください。
  3. 時間変換の php 側を行います。
  4. または、必ず 1 と 2 を実行してください。ストアド プロシージャにラップされ、タイムゾーンがパラメータとして渡されます。
于 2012-08-01T08:16:26.210 に答える