改进 MySQL 查询:计算行数
Improving MySQL Query: Count rows
我有以下查询,加载需要几分钟,而实际上我只需要计算它有多少行 returns。我想知道是否可以改进此查询?
SELECT (clock - clock mod 300) as time, avg(value) as value FROM table.history_uint WHERE itemid = 82660 AND clock >= UNIX_TIMESTAMP('".$date."') AND clock <= UNIX_TIMESTAMP('".$date."') GROUP BY time;
这是我的代码:
$queryPageInfo = "SELECT (clock - clock mod 300) as time, avg(value) as value FROM table.history_uint WHERE itemid = 82660 AND clock >= UNIX_TIMESTAMP('".$date."') AND clock <= UNIX_TIMESTAMP('".$date."') GROUP BY time";
$resultPageInfo = $mysqli->query($queryPageInfo);
$qtd = $resultPageInfo->num_rows;
试试这个:
SELECT COUNT(DISTINCT clock DIV 300)
FROM table.history_uint
WHERE itemid = 82660 AND clock = UNIX_TIMESTAMP('".$date."')
;
(clock - clock mod 300)
应该与 clock div 300
的值相同,但可能开销较小; mod 操作通常是一些更昂贵的操作,因为它们通常被实现为 x-(x*(x div y))。由于您只需要返回的行数,因此您只需要分组的值的数量;因此 COUNT(DISTINCT)
;正如@ssnobody 上面指出的那样,x <= y && x >= y 表示 x==y.
我有以下查询,加载需要几分钟,而实际上我只需要计算它有多少行 returns。我想知道是否可以改进此查询?
SELECT (clock - clock mod 300) as time, avg(value) as value FROM table.history_uint WHERE itemid = 82660 AND clock >= UNIX_TIMESTAMP('".$date."') AND clock <= UNIX_TIMESTAMP('".$date."') GROUP BY time;
这是我的代码:
$queryPageInfo = "SELECT (clock - clock mod 300) as time, avg(value) as value FROM table.history_uint WHERE itemid = 82660 AND clock >= UNIX_TIMESTAMP('".$date."') AND clock <= UNIX_TIMESTAMP('".$date."') GROUP BY time";
$resultPageInfo = $mysqli->query($queryPageInfo);
$qtd = $resultPageInfo->num_rows;
试试这个:
SELECT COUNT(DISTINCT clock DIV 300)
FROM table.history_uint
WHERE itemid = 82660 AND clock = UNIX_TIMESTAMP('".$date."')
;
(clock - clock mod 300)
应该与 clock div 300
的值相同,但可能开销较小; mod 操作通常是一些更昂贵的操作,因为它们通常被实现为 x-(x*(x div y))。由于您只需要返回的行数,因此您只需要分组的值的数量;因此 COUNT(DISTINCT)
;正如@ssnobody 上面指出的那样,x <= y && x >= y 表示 x==y.