我目前是设计网站的团队的一员,该网站可能会有数千名用户进行大量与日期相关的搜索。在设计阶段,我们一直在努力确定哪种方案对性能优化更有意义。
我们应该将datetime字段存储为mysql日期时间吗?或者应该将其分解为多个字段(年,月,日,小时,分钟......)
问题在于大型数据集和潜在的大量用户,我们是否会获得性能明智地将日期时间分成多个字段并节省依赖于mysql日期函数?或者mysql已经针对此进行了优化?
答案 0 :(得分:1)
查看MySQL Date & Time Functions documentation,因为您可以使用YEAR,MONTH等现有功能从日期中提取具体信息。但是,如果您有这些功能,日期列上的索引,使用这些函数意味着不能使用这些索引......
将日期存储为单独组件的问题是,当您想要进行范围比较或日期操作时,需要将它们重建为日期。
最终,选择最适合您的应用程序。如果很少需要拆分日期,请考虑使用VIEW公开日期组件,而不会在表中写入可能多余的信息。
答案 1 :(得分:0)
使用常规日期时间字段。如果性能成为问题,您可以随时切换到分离的组件。尽量避免过早优化 - 在很多情况下,YAGNI。您最终可能会使用两者日期时间字段和分离的组件方法,因为它们都有自己的优势。
答案 2 :(得分:0)
如果您提前知道所有搜索都会有一些关键标准,那么MySQL(> = v5.1)table partitioning可能有所帮助。
例如,如果您有这样的表:
create table Books(pubDate dateTime, title varchar(50));
并且您知道所有搜索必须至少包含一年,您可以在日期字段中对其进行分区,并按以下方式进行:
create table Books(pubDate dateTime,title varchar(50)
partition by hash(year(pubDate)) partitions 10;
然后,当您对表运行select时,如果where子句包含限制分区的条件,结果可以存在,则搜索将仅扫描该分区,而不是全表扫描。您可以通过以下方式查看此操作:
-- scans entire table
explain partitions select * from Books where title='%title%';
与之类似:
-- scans just one partition
explain partitions select * from Books
where year(pubDate)=2010
and title='%title%';
MySQL documentation on this非常好,您可以从多种分区算法中进行选择。
即使您选择拆分日期,例如,年(int)(假设搜索将始终指定一年)的表分区也可以提供帮助。