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

pla*_*men 5 mysql optimization date-format

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

SELECT * FROM table WHERE DATE_FORMAT(date_field, '%m%d') = '1128' LIMIT 10
Run Code Online (Sandbox Code Playgroud)

我试图在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)at 996.783Mhz
RAM:512MB DDR
HDD:80GB SATA

PS我试图添加另一列,将日期保存为%m%d。结果非常好,但我仍然不喜欢这种方法。我正在等待更多建议!

nos*_*nos 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);
);
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这利用了对小 time_dimension 的过滤,并且 date_field = dbdate 上的联接通常会使用索引。