-1

此表包含服务器监控记录。一旦服务器无法 ping,它就会插入新记录。因此,一台服务器可能会发生多次故障。我想获取 SERVER 3 失败的记录数。

这是failure_id主键所在的表。

failure_id  server_id  protocol  added_date           
----------  ---------  --------  ---------------------
         1          1  HTTP      2013-02-04 15:50:42  
         2          3  HTTP      2013-02-04 16:35:20

使用 (*) 计算行数

SELECT 
  COUNT(*) AS `total` 
FROM
  `failures` `f` 
WHERE CAST(`f`.`server_id` AS CHAR) = 3;

使用 server_id 计算行数

SELECT 
  COUNT(`f`.`server_id`) AS `total` 
FROM
  `failures` `f` 
WHERE CAST(`f`.`server_id` AS CHAR) = 3;

使用 SUM 计算行数

SELECT 
  IFNULL(SUM(1), 0) AS `total` 
FROM
  `failures` `f` 
WHERE CAST(`f`.`server_id` AS CHAR) = 3;

以上所有查询都返回正确的输出。但是我的数据库将来会很大。根据性能最好使用哪种方法?提前致谢...

4

4 回答 4

0

我会说以上都不是。如果您可以控制插入记录的应用程序。如果是这样,如果您的服务器没有表,只需创建一个。否则添加一个名为current_failure_count或其他内容的字段并将其粘贴在该表中。因此,当您插入记录时,还要对您的服务器表进行更新并current_failure_count = current_failure_count + 1为该服务器设置。这样你只需要读取服务器表中的一条记录(server_id我假设索引),你就设置好了。不,这不遵循任何规范化规则,但您正在寻求速度,如果您可以控制客户端软件,这是获得它的最佳方式。

如果您无法控制客户端软件,也许您可​​以在将记录插入失败表时设置触发器,以增加current_failure_count服务器表中的值。这也应该有效。

于 2013-02-05T04:17:10.397 回答
0

嗯,第二个肯定比第一个更有效率。我建议您为服务器创建一个视图,这将大大加快速度

CREATE VIEW server3 AS
SELECT server_id
FROM failures
CAST(`f`.`server_id` AS CHAR) = 3;

然后只需对该视图进行计数,就好像它是一张桌子一样!

于 2013-02-05T03:56:59.363 回答
0

像其他人一样,我不清楚为什么要转换 server_id 值。这将比任何其他问题花费更多的性能。

如果您可以消除该强制转换以便您进行搜索WHERE server_id = (value)并在其上创建索引,server_id那么您建议的前两个查询中的任何一个都将能够执行仅索引检索并提供最佳性能。

于 2013-02-05T04:09:08.570 回答
0
SELECT COUNT(*) AS `total`
FROM  failures f
WHERE f.server_id = 3;

count(*)总是比算术计算好,尽管应用索引会给出更快的结果。

第二好的解决方案将是

SELECT IFNULL(SUM(1), 0) AS `total`
FROM failures `f`
WHERE f.server_id  = 3;

这个方法是用我的微策略等很多工具的SQL引擎

希望答案有帮助... :)

于 2013-02-05T04:12:16.833 回答