Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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
Php 优化SQL查询_Php_Mysql_Sql - Fatal编程技术网

Php 优化SQL查询

Php 优化SQL查询,php,mysql,sql,Php,Mysql,Sql,我必须获取数据库中发布日期介于两个日期之间的所有条目。所有日期都存储为整数,因为日期采用UNIX时间戳格式。。。 下面的查询工作得很完美,但需要“太长时间”。它返回10到20 daz之间的所有条目 SELECT * FROM tbl_post WHERE published < (UNIX_TIMESTAMP(NOW())-864000) AND published> (UNIX_TIMESTAMP(NOW())-1728000) 从发布的tbl_帖子中选择*(UNIX_时间戳

我必须获取数据库中发布日期介于两个日期之间的所有条目。所有日期都存储为整数,因为日期采用UNIX时间戳格式。。。 下面的查询工作得很完美,但需要“太长时间”。它返回10到20 daz之间的所有条目

SELECT * FROM tbl_post WHERE published <  (UNIX_TIMESTAMP(NOW())-864000) 
AND published> (UNIX_TIMESTAMP(NOW())-1728000)
从发布的tbl_帖子中选择*<(UNIX_时间戳(NOW())-864000)
并已发布>(UNIX_时间戳(NOW())-1728000)
有没有办法优化这个查询?如果我没有弄错的话,它正在调用evey条目上的NOW()和UNIX_时间戳。我认为将这两个重复函数的结果保存到mysql@var中可以加快比较速度,但事实并非如此。我运行的第二个代码是:

SET @TenDaysAgo = UNIX_TIMESTAMP(NOW())-864000;
SET @TwentyDaysAgo = UNIX_TIMESTAMP(NOW())-1728000;
SELECT * FROM tbl_post WHERE fecha_publicado <  @TenDaysAgo 
AND fecha_publicado > @TwentyDaysAgo;
SET@TenDaysAgo=UNIX_时间戳(NOW())-864000;
设置@TwentyDaysAgo=UNIX_时间戳(NOW())-1728000;
从tbl_post中选择*,其中fecha_publicado<@TenDaysAgo
和fecha_publicado>@TwentyDaysAgo;
另一件令人困惑的事情是,PHP无法通过mysql_query();?运行上述查询

请,如果您对此问题有任何意见,我们将非常欢迎:)


Luka

PHP的mysql_查询函数(假设您正在使用)只能接受每个字符串一个查询,因此它无法执行第二个查询中的三个查询

我建议将这些东西移到一个函数中,并从PHP调用它

至于优化,设置这些变量的优化程度与查询的优化程度差不多。您需要对每一行进行比较,设置一个变量可以提供对下限和上限的最快访问时间


表索引(而不是查询本身)的一个改进是围绕fecha_publicado对索引进行集群,以允许MySQL智能地处理该范围的值的查询。通过将fecha_publicado设置为表的主键,可以很容易地做到这一点。

PHP的mysql_查询函数(假设您正在使用)只能接受每个字符串一个查询,因此它无法执行第二个查询中的三个查询

我建议将这些东西移到一个函数中,并从PHP调用它

至于优化,设置这些变量的优化程度与查询的优化程度差不多。您需要对每一行进行比较,设置一个变量可以提供对下限和上限的最快访问时间

表索引(而不是查询本身)的一个改进是围绕fecha_publicado对索引进行集群,以允许MySQL智能地处理该范围的值的查询。通过将fecha_publicado设置为表的主键,您可以轻松做到这一点。

优化的方法是根据日期范围将表tbl_post划分到已发布的键上(每周似乎适合您的查询)。这是一个可用于、Oracle、Greenplum等的功能

这将允许查询优化器将查询限制在更窄的数据集上。

优化的方法是根据日期范围对已发布键上的表tbl_post进行分区(每周似乎适合您的查询)。这是一个可用于、Oracle、Greenplum等的功能


这将允许查询优化器将查询限制到更窄的数据集。

需要检查的明显内容是,在发布日期是否有索引,以及是否正在使用该索引?

需要检查的明显内容是,在发布日期是否有索引,它正在被使用吗?

请确保发布了一个索引。并确保它正在被使用

EXPLAIN SELECT * FROM tbl_post WHERE published <  (UNIX_TIMESTAMP(NOW())-864000)  AND published> (UNIX_TIMESTAMP(NOW())-1728000)

请确保已发布上的索引,并确保正在使用该索引

EXPLAIN SELECT * FROM tbl_post WHERE published <  (UNIX_TIMESTAMP(NOW())-864000)  AND published> (UNIX_TIMESTAMP(NOW())-1728000)

我同意Braedep的观点,存储过程在这里是合适的。如果您不能使用一个或确实不想使用,您可以始终在PHP端生成日期,但除非您同步了日期,否则它们可能与数据库不完全匹配


您还可以更快地完成这项工作,因为可能需要3个单独的查询。查询开始数据,查询结束日期,然后将这些值作为输入输入到目标查询中。

我同意Braedep的观点,在这里使用存储过程是合适的。如果您不能使用一个或确实不想使用,您可以始终在PHP端生成日期,但除非您同步了日期,否则它们可能与数据库不完全匹配


您还可以更快地完成这项工作,因为可能需要3个单独的查询。查询开始数据,查询结束日期,然后将这些值作为输入输入到目标查询中。

分区是一项功能,只有在有大量数据时才需要。MySQL也有分区。如果这样的查询花费的时间太长,并且他已经在发布的字段上有了索引,那么该表中很可能有足够的数据。我还提供了一个指向MySQL分区文档的链接:)分区是一个只在数据量太大时才需要的特性。MySQL也有分区。如果这样的查询花费的时间太长,并且他已经在发布的字段上有了索引,那么该表中很可能有足够的数据。我确实提供了一个指向MySQL分区文档的链接:)注意,
NOW()
是一个常量表达式,表示语句开始执行的时间。因此,MySQL没有理由不能将
UNIX\u TIMESTAMP(NOW())-864000
转换为常量表达式。(我不知道它是否有…只是它很容易做到。)请注意,
NOW()
是一个常量表达式,表示语句开始执行的时间。因此,MySQL没有理由不能将
UNIX\u TIMESTAMP(NOW())-864000
转换为常量表达式。(我不知道它是否有…只是它很容易做到。)我也将我的fecha_publicado(或published)设置为索引键,但性能并没有真正提高?我检查了EXPLAIN,它说这个属性是一个索引键。奇怪…你能把解释贴出来吗