Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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函数调用? 选择hourdatetime,COUNTanimal\u id 从动物身上 其中hourdatetime>8且hourdatetime_Mysql_Sql_Refactoring_Sql Tuning - Fatal编程技术网

如何在单个查询中减少冗余的MySQL函数调用? 选择hourdatetime,COUNTanimal\u id 从动物身上 其中hourdatetime>8且hourdatetime

如何在单个查询中减少冗余的MySQL函数调用? 选择hourdatetime,COUNTanimal\u id 从动物身上 其中hourdatetime>8且hourdatetime,mysql,sql,refactoring,sql-tuning,Mysql,Sql,Refactoring,Sql Tuning,我正在学习SQL。在我的查询中,我打了四次hourdatetime。我很好奇1这种冗余是否会影响性能,2我如何简化这种冗余代码 如果小时列具有整数值,请尝试此列。我们只能删除一次冗余 选择小时 ,COUNTanimal_id 从动物身上 8点到8点之间的哪一小时 和20 按小时分组 如果hour是dateformat,请尝试下面的代码 选择DATEPARTHH,小时 ,COUNTanimal_id 从动物身上 其中DATEPARTHH,8点之间的小时 和20 按日期分组Parthh,小时 这会影

我正在学习SQL。在我的查询中,我打了四次hourdatetime。我很好奇1这种冗余是否会影响性能,2我如何简化这种冗余代码

如果小时列具有整数值,请尝试此列。我们只能删除一次冗余

选择小时 ,COUNTanimal_id 从动物身上 8点到8点之间的哪一小时 和20 按小时分组

如果hour是dateformat,请尝试下面的代码

选择DATEPARTHH,小时 ,COUNTanimal_id 从动物身上 其中DATEPARTHH,8点之间的小时 和20 按日期分组Parthh,小时

这会影响性能吗

可能没有任何意义。查询的性能通常由检索和处理数据所做的工作决定。这通常比内置函数的开销要昂贵得多,尽管也有一些例外情况,例如正则表达式可能会非常昂贵

MySQL允许在分组中使用列别名。因此,一个有效的简化方法是:

SELECT hour(datetime) as hh, COUNT(animal_id)
FROM animal_outs 
WHERE hour(datetime) > 8 AND hour(datetime) < 20
GROUP BY hh;
从技术上讲,这就是你想要的。但是,由于它在聚合之后进行过滤,因此它对分组进行了额外的工作。这可能会超过不打电话所节省的时间

另一种方法是子查询:

SELECT hh, COUNT(animal_id)
FROM (SELECT hour(datetime) as hh, animal_id
      FROM animal_outs 
     ) ao
WHERE hh > 8 AND hh < 20
GROUP BY hh;
在大多数数据库中,这将满足您的需要。在MySQL的最新版本中可能会出现这种情况。然而,MySQL有一种令人恼火的具体化倾向,即在FROM子句中写入磁盘子查询。这就增加了额外的开销——再一次,可能比每小时的额外通话量还要多


注意:小时可能是一个非常昂贵的函数,您可能会发现后两种解决方案中的任何一种都更快。此外,只有当您的数据至少有几千行时,您可能才会看到对性能的影响。不考虑这些问题,通常会快速处理几十行或几百行的小表。

,请检查解决方案并让我知道。我怀疑调用的多样性对性能有多大影响。影响来自于查询无法使用索引,但我不确定在这个例子中您是否可以做很多事情-除非,正如另一个响应者所建议的,创建另一个只包含索引整数小时的列。
SELECT hh, COUNT(animal_id)
FROM (SELECT hour(datetime) as hh, animal_id
      FROM animal_outs 
     ) ao
WHERE hh > 8 AND hh < 20
GROUP BY hh;