在我的数据库中,有一个名为Profile
的表格,其DATETIME
字段名为birthday
。
我想查询 05-24 和 06-07 (mm-dd
)之间生日的所有记录,无论它是哪一年,我使用以下查询:
DATE_FORMAT(`Profile`.`birthday`, "%m-%d") >= '05-24'
AND DATE_FORMAT(`Profile`.`birthday`, "%m-%d") < '06-07'
问题是通过这种方式,birthday
列上的索引 没有用,查询太慢了,我想提高速度我的查询
请告诉我是否有任何解决方法仍然可以完成工作并同时提高查询性能
答案 0 :(得分:2)
是,
原因是您在WHERE中的字段上使用了FUNCTION。这意味着MySQL必须读取表的所有记录(FULL TABLE SCAN)。
您可以添加一个新字段birthday2,其中只存储日期和月份,其中包含标准化年份,例如
UPDATE yourTable set birthday2 = DATE_FORMAT(Profile.birthday, "%m-%d-0001");
十你可以选择
SELECT * from yourTable
WHERE birthday2 BETWEEN ''05-24-0001' AND '06-07-001';
如果您在此字段上设置索引,则会使用
答案 1 :(得分:0)
添加另一列
mmdd CHAR(5) CHARACTER SET ascii
and
INDEX(mmdd)
使用带有UPDATE
SET mmdd = DATE_FORMAT(..., "%m-%d")
进行设置
作为一个字符串(CHAR
),它会比较'正确',除非你绕一年边界(例如,11月到2月)。
5.6 - 明确表示 对于5.7或MariaDB - 使用虚拟列。
请记住,如果您的日期范围“太大”(大约2个月左右),优化程序将忽略索引并执行全表扫描。这是故意的,实际上是最佳的。