Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理MySQL date的最佳方法,以提高数千用户的性能_Mysql_Performance_Optimization_Query Optimization - Fatal编程技术网

处理MySQL date的最佳方法,以提高数千用户的性能

处理MySQL date的最佳方法,以提高数千用户的性能,mysql,performance,optimization,query-optimization,Mysql,Performance,Optimization,Query Optimization,我目前是一个团队的成员,该团队设计了一个可能有数千名用户的网站,这些用户将进行大量与日期相关的搜索。在设计阶段,我们一直在努力确定哪一个对性能优化更有意义 我们是否应该将datetime字段存储为mysql datetime。或者应该将其分解为若干字段(年、月、日、小时、分钟等) 问题是,对于一个庞大的数据集和一个潜在的庞大的用户集,我们是否能够在性能上明智地将datetime分解为多个字段,并依靠mysql的日期函数进行保存?或者mysql已经为此进行了优化吗?看看,因为您可以使用现有函数(如

我目前是一个团队的成员,该团队设计了一个可能有数千名用户的网站,这些用户将进行大量与日期相关的搜索。在设计阶段,我们一直在努力确定哪一个对性能优化更有意义

我们是否应该将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)上的表分区(假设搜索总是指定一年)