2009-08-19 1901 views
4

我试图优化相对较大的MySQL(myisam)表220,000行。桌子本身并不大 - 大小约为23.5MB。那么,真正的问题是什么? - 我有这样的查询:如何在where子句中优化mysql date_format()以提高速度?

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

我试图设置DATE_FIELD的指数,而是要解释表明,该指数不使用在所有...我想这是因为DATE_FORMAT不那么陌生()。所以,我打算添加另一列,将日期保存为'%m%d'并在其上放置索引。我不想做这件事的唯一原因是因为数据重复。
顺便说一句我用DATE_FIELD是一个出生日期字段,我敢肯定,我总是需要DATE_FIELD为%Y-%间%d或刚刚%M%d

你对如何优化查询更好的建议以上 ?提前致谢 !!!

一些信息:

MySQL的版本:在996.783Mhz
RAM奔腾III(Coppermine的):512MB DDR
硬盘:80GB SATA

5.0.51b日志
OS:Slackware的12.1
CPU

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

回答

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

+0

感谢您的建议号!我不认为这对我的情况非常有用(我插入了一些笔记),但总的来说这是一个很好的方向! – plamen 2009-08-19 19:10:49

+0

对未来也有好处。如果您需要过滤所有星期四,则只需向time_dimension添加另一列,然后使用where t.dayname ='Thursday'。或在一个月内所有周末将成为其中t.year = 2009和t.month = 9,t.weekend_flag = 1 :-) – nos 2009-08-19 19:15:09

+0

与出生日期打交道时,除非该数据库向婴儿面向并不能真正帮助。 – jmucchiello 2009-08-19 19:22:00