处理MySQL date的最佳方法,以提高数千用户的性能
我目前是一个团队的成员,该团队设计了一个可能有数千名用户的网站,这些用户将进行大量与日期相关的搜索。在设计阶段,我们一直在努力确定哪一个对性能优化更有意义 我们是否应该将datetime字段存储为mysql datetime。或者应该将其分解为若干字段(年、月、日、小时、分钟等) 问题是,对于一个庞大的数据集和一个潜在的庞大的用户集,我们是否能够在性能上明智地将datetime分解为多个字段,并依靠mysql的日期函数进行保存?或者mysql已经为此进行了优化吗?看看,因为您可以使用现有函数(如等)从日期中提取特定信息。但是,尽管这些函数存在,但如果您在日期列上有索引,使用这些函数意味着无法使用这些索引 将日期存储为单独组件的问题在于,当您要进行范围比较或日期操作时,需要将其重新构建为日期处理MySQL date的最佳方法,以提高数千用户的性能,mysql,performance,optimization,query-optimization,Mysql,Performance,Optimization,Query Optimization,我目前是一个团队的成员,该团队设计了一个可能有数千名用户的网站,这些用户将进行大量与日期相关的搜索。在设计阶段,我们一直在努力确定哪一个对性能优化更有意义 我们是否应该将datetime字段存储为mysql datetime。或者应该将其分解为若干字段(年、月、日、小时、分钟等) 问题是,对于一个庞大的数据集和一个潜在的庞大的用户集,我们是否能够在性能上明智地将datetime分解为多个字段,并依靠mysql的日期函数进行保存?或者mysql已经为此进行了优化吗?看看,因为您可以使用现有函数(如
最后,选择最适合您的应用程序的。如果很少需要拆分日期,请考虑使用A来公开日期组件,而不必将冗余信息写入表中。
使用常规的DATE时间字段。如果性能出现问题,您可以始终切换到后续的单独组件。尝试避免过早优化-在许多情况下,YAGNI。您可能会同时使用datetime字段和分离组件方法,因为它们都有各自的优势。
如果您提前知道所有搜索都将具备的一些关键条件,MySQL(>=v5.1)可能会有所帮助 例如,如果您有这样一个表: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非常好,您可以从多种分区算法中进行选择
即使您选择拆分日期,也可以使用例如年(int)上的表分区(假设搜索总是指定一年)