ハードディスクメンテナンスハードディスクメンテナンスハードディスクの診断、物理フォーマット、静音化、Linux、サーバー、MySQLなどがメインだったのですが、その後広がり、カメラやハードウェアの投稿も増えてきました。これらを使いながら、ブログを更新しています。日付比較や日付検索が遅いのでBETWEENで改善させるdatetime型の列(reg_time)があるテーブルに対し、年月日指定をかけてデータを取り出す。'2014-01-01%'これは非常に遅い。reg_timeにindexを設定しても、indexが使用されないので無意味。12:34:56)から年月日(2014-01-01)を取り出す関数。'2014-01-01'これも同様に遅い(indexも使用されない)。この解決方法は、BETWEENを使用することである。23:59:59'これにより、高速化が可能。EXPLAINで動作を見ると、typeがallからrangeになっていることが分かる。typeは、テーブルに対してどのような方法でアクセスするのかを示すもの。allはフルテーブルスキャンで、インデックスが全く使用されていないことを表す、最悪なモノだ。rangeは、インデックスを用いた範囲検索である。2014年1月1日の始端(00:00:00)と終端(23:59:59)を設定し、その間(BETWEEN)とすれば、同じものがSELECTでき、強引にBETWEEN化できるのは分かる。これはそれでよいとして、年月指定(日がない)の場合はどうか。'2014-01-'注:LEFT(`reg_time`,'7')は、reg_timeの左から7文字を取り出す、つまり年-月を取得する関数。23:59:59'とすると...エラーにはならないが、返された結果が0となり、不可wwwww32日は存在しない日だからだろう。なると、その月の最終日(月末日,晦日)を求めなければならない。PHPであれば、cal_days_in_month(CAL_GREGORIAN,$month,$year)という関数がある(年と月の順序に注意)。これは月末を求める関数ではなく、その年月の日数($hikazu)を求めるものだ。'$to'とすればよい。MySQLの日付/時刻関数にlast_dayというものがある。これは、与えた年月日の月末(年月日)を返す。23:59:59')とすることができる。BETWEENを使うと高速化できるのは分かるが、コードが長くなるし、直感的でもないし、スマートじゃないね...-----`reg_time`にはミリ秒は格納されていないので、23:59:59.x秒が範囲外になることはない。含むので、不適である。INTERVALは両端を含む仕様だからだ。以下のようなテーブルがあり、カラム(reg_time)に以下が格納されている。00:00:00となり、2件返されてしまう。00:00:00(翌日の00:00:00)が含まれてしまうのでアウト。データに「00:00:00」が記録されているかはその記録頻度にも寄るが、開発時点で含まれていなければ「問題ナシッ!」てコトで通ってしまいかねない(笑)で、運用開始後、「00:00:00」が記録され、一致せずに「オカシーナー♪」となる。;と書けばどうなるのかはシラン(SILANE)。