如何在where子句中优化mysql date_format()的速度?

时间:2009-08-19 18:41:46

标签: mysql optimization date-format

我正在尝试使用220,000行优化相对较大的mysql(myisam)表。表本身并不是那么大 - 大小约为23.5MB。那么,真正的问题是什么? - 我得到这样的查询:

SELECT * FROM table WHERE DATE_FORMAT(date_field, '%m%d') = '1128' LIMIT 10

我试图在date_field上设置一个索引但是EXPLAIN显示索引根本就没用过......我想这并不是因为DATE_FORMAT()而这么奇怪。所以,我打算添加另一个列,将日期保存为'%m%d'并在其上放置一个索引。我不想这样做的唯一原因是因为数据重复 顺便说一下,我使用date_field是一个生日字段,我确信我总是需要date_field为%Y-%m-%d或只是%m%d

您对如何优化上述查询有更好的建议吗?在此先感谢!!!

一些信息:

MySQL版本:5.0.51b-log
操作系统:slackware 12.1
CPU:Pentium III(Coppermine),996.783Mhz
内存:512MB DDR
硬盘:80GB SATA

P.S 我尝试添加另一个日期为%m%d的列。结果非常好,但我仍然不喜欢这种方法。我在等待更多建议!

1 个答案:

答案 0 :(得分:2)

如果您在这一年总是需要一个通配符,就像那里的查询一样,我不确定mysql是否能够在日期/日期时间字段上使用索引

如果这些只是日期,您可以创建一个time_dimension表,并使用日历预填充下一个年份。如果您需要,我有一个存储过程来执行此操作。

create table time_dimension (
 dbdate date primary key,
 year int NOT NULL,
 month int  NOT NULL , 
 day int NOT NULL,
 KEY(year),
 KEY(month);
 KEY(day);
);

您将大数据表加入到这个相对较小的表中,并对其字段进行过滤。例如

SELECT * FROM data_table d 
  inner join time_dimension t 
    on d.date_field=t.dbdate 
where t.day=28 and t.month=11 LIMIT 10

这会利用对time_dimension的过滤,而date_field = dbdate上的连接通常会使用索引。