私は現在MYSQL DB最適化に取り組んでいます。私はいくつかの遅いクエリを見回していて、それらのいくつかを最適化しようとしています。
私のアプリでは、統計の目的で、クエリと、訪問者のログエントリ(クリック、オープン、インプレッションなど)を含む非常に大きなテーブル(何百万ものレコード)を使用しています。そのテーブルには以下が含まれます:
ID
(INT
、Primary Key
)OpenDate
(DATETIME
)ListID
(INT
)UserID
(INT
)1日あたりの行数を取得する必要があります。ですから、DATETIMEをDATEに変換して、GROUP BYの日の値にできるようにする必要があります。
DATETIME
の形式はyyyy-mm-dd hh:ii:ssです現在、クエリは次のとおりです。
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が日付を再フォーマットする代わりに文字列をカットする方が簡単ではありませんか?
ご協力いただきありがとうございます。
ジョフリー
OpenDate
はdatetime
列なので、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)
にインデックスを追加して、より効率的にします。