我正在尝试使用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的列。结果非常好,但我仍然不喜欢这种方法。我在等待更多建议!
答案 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上的连接通常会使用索引。