質問: 環境:CentOS7、mariadb10.2 以下のフォーマットのテーブルがあります。 ■TEST_TABLE NUMBER int(8) AutoIncrement DATETIME datetime VALUE int(10) テーブルには4から6秒置き(処理時間により多少前後する)にリアルタイムでデータを挿入しています。テーブルには最大30日分/50万件近くのデータが入っています。処理の中で「もっとも1分前に近いVALUEを取り出す」ことをしたいのですが、うまく速度が出ません。 □試したSQL select VALUE from TEST_VALUE where DATETIME<'%s' order by NUMBER desc LIMIT 1 ※%sには現在1分前の日付時刻 上記SQLではCerelonの開発機で試したところ、1回のSelectに0.1秒ほどかかってしまっています。 DATETIMEにindexを貼ってみましたがあまり効果がありませんでした。 回避策として「LIMIT句で、現在からさかのぼって15件拾ってから、その15件でループをまわして1分前のデータを取得する」ようにしたところ、0.01秒まで短縮できました。が、処理として美しくなく、1時間前となるとそのまま使えず、まだ早くなる余地があると思っています。 どなたか、アドバイスをお願いします。
回答: 現在時刻より60秒前、かつ現在時刻より70秒前の間のものだけをWHEREで絞り込んでみてはどうでしょうか。 ``` SELECT VALUE FROM TEST_VALUE WHERE DATETIME BETWEEN CURRENT_TIMESTAMP - INTERVAL 70 SECOND AND CURRENT_TIMESTAMP - INTERVAL 60 SECOND ORDER BY DATETIME ASC LIMIT 1 ```