web-dev-qa-db-ja.com

MySQL:DATE_FORMAT()とSUBSTR()

私は現在MYSQL DB最適化に取り組んでいます。私はいくつかの遅いクエリを見回していて、それらのいくつかを最適化しようとしています。

私のアプリでは、統計の目的で、クエリと、訪問者のログエントリ(クリック、オープン、インプレッションなど)を含む非常に大きなテーブル(何百万ものレコード)を使用しています。そのテーブルには以下が含まれます:

  • IDINTPrimary Key
  • OpenDateDATETIME
  • ListIDINT
  • UserIDINT
  • ...その他のフィールド

1日あたりの行数を取得する必要があります。ですから、DATETIMEをDATEに変換して、GROUP BYの日の値にできるようにする必要があります。

  • DATETIMEの形式はyyyy-mm-dd hh:ii:ssです
  • 事実、私に必要なのは最初の10文字だけです:yyyy-mm-dd

現在、クエリは次のとおりです。

SELECT COUNT(*) AS TotalOpens, DATE_FORMAT(OpenDate,  '%Y-%m-%d') AS DayOfWeek 
FROM `stats_open` WHERE ListID='38' AND UserID='4'
GROUP BY crc32(DayOfWeek) ORDER BY TotalOpens DESC

しかし、私はDATE_FORMAT関数をSUBSTR()関数に変更する必要があるのか​​と思うので、MySQLは少し少なく機能しますか? MySQLが日付を再フォーマットする代わりに文字列をカットする方が簡単ではありませんか?

ご協力いただきありがとうございます。

ジョフリー

1
Joffrey

OpenDatedatetime列なので、DATE_FORMAT()を使用する必要はなく、単にGROUP BY DATE(OpenDate)を使用できます。そして、余分なCRC32()呼び出しは完全に冗長に見えます。

クエリは書き換えることができます:

SELECT COUNT(*) AS TotalOpens, 
       DATE(OpenDate) AS DayOfWeek 
FROM stats_open 
WHERE ListID = 38 
  AND UserID = 4
GROUP BY DATE(OpenDate) 
ORDER BY TotalOpens DESC ;

(ListID, UserID, OpenDate)にインデックスを追加して、より効率的にします。

2
ypercubeᵀᴹ