私は何か問題を引き起こしているクエリがあります。私はこのSQLを書く良い方法があるのだろうかと思っています。遅いSQLクエリ - 日付間隔に応じてデータを選択します。
SELECT * FROM report
WHERE blogid = 1769577
AND DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= datetime
したがって、結果がより高速に取得されます。
ありがとうございます。
私は何か問題を引き起こしているクエリがあります。私はこのSQLを書く良い方法があるのだろうかと思っています。遅いSQLクエリ - 日付間隔に応じてデータを選択します。
SELECT * FROM report
WHERE blogid = 1769577
AND DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= datetime
したがって、結果がより高速に取得されます。
ありがとうございます。
あなたのテーブルが巨大である場合、あなたは大きなを持つことができ、水平パーティショニングを考慮するかもしれない
を私は、クエリに何か問題が表示されていないが、あなたはのblogidのインデックスを持っていることを確認してください可能性があり、日時列パフォーマンスへの影響http://dev.mysql.com/tech-resources/articles/performance-partitioning.html
Oracle SQLでは、+/-演算子を使用して日付演算を行うことができます。私はそれがMySQLで動作するかどうかは分かりませんが、datetime> =(CURDATE() - 30)を試してみることもできます。
SELECT * FROM report WHERE blogid = 1769577 AND datetime >= (curdate() - 30)
編集:このブログのエントリは私の提案を確認しているようだ:http://mysql-tips.blogspot.com/2005/04/mysql-date-calculations.html
私はAND datetime> =(CURDATE() - INTERVAL 30 DAY)を使用できると思います。 – gus
私は内部DATEDIFF()関数を使用して、代わりの間隔を引く示唆しています。このように:
datediff(curdate(), datetime) < 30
ので、クエリは次のとおりです。
SELECT * FROM report WHERE blogid = 1769577 AND datediff(curdate(), datetime) < 30
WHERE句のフィールドに関数を適用すると、そのフィールドのインデックスは使用できなくなります。従ってdatetime>(currtime - 30)は(currtime - datetime)<30. –
よりも良いかもしれません。私はそれを考慮していませんでした。ありがとう。 – farzad
推測1:あなたのblogid
はint
列ではありません。次に、MySQLのマニュアルを読むことができます: 変換なしで直接比較することはできません 値ならば、異なる列の
比較は 索引の使用を妨げることがあります。数字の 列が文字列と比較されるとします。 数字列の の1などの特定の値の場合、文字列 の値と、 '1'、 '1'、 '00001' 。これは、文字列のインデックスを のインデックスの使用を排除します。
推測2:あなたのblogid
は索引付けされていません。
推測3:レポート表はmyisamです。この場合、データを変更すると、MySQLはテーブル全体でreports
テーブルレベルロックを使用します。ブログを閲覧するたびに新しいレコードが追加されます。これらの頻繁な更新により、テーブルレベルのロックが発生し、選択クエリが遅くなる可能性があります。
これ以外のクエリは正常です。
乾杯!
30日以上経過した特定のブログの情報を選択しているとします。 datetime列にはSQL datetime値としてデータが格納されます。右? – farzad
むしろ、データの有効期限が30日未満* – ktm5124
これは、レポートデータを格納する別のテーブルではありません。 id、blogid、report_type(int)、およびdatetimeが含まれます。基本的にブログが表示されるたびに、レコードがこのテーブルに挿入されます。 – gus