5

我正在尝试优化具有 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) at 996.783Mhz
RAM:512MB DDR
HDD:80GB SATA

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

4

1 回答 1

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 上的连接通常会使用索引。

于 2009-08-19T18:58:31.363 回答