此表包含服务器监控记录。一旦服务器无法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;
以上所有查询都会返回正确的输出。但是我的数据库将来会非常庞大。根据性能最好使用哪种方法?提前谢谢......
答案 0 :(得分:0)
嗯,第二个肯定比第一个更有效。 我建议您为服务器创建一个视图,这将严重加快速度
CREATE VIEW server3 AS
SELECT server_id
FROM failures
CAST(`f`.`server_id` AS CHAR) = 3;
然后只需在该视图上运行一次计数,就好像它是一张桌子一样!
答案 1 :(得分:0)
与其他人一样,我不清楚为什么要投射server_id值。与其他任何问题相比,这将使您获得更多性能。
如果您可以消除该转换,以便您搜索WHERE server_id = (value)
并在server_id
上创建索引,那么您建议的前两个查询中的任何一个都将能够执行仅索引检索将提供最佳表现。
答案 2 :(得分: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引擎,如microstrategy
希望答案有帮助......:)
答案 3 :(得分:0)
我不会说上述情况。如果您可以控制插入记录的应用程序。如果是这样,如果您没有服务器表,只需创建一个。否则添加一个名为current_failure_count
或其他的字段并将其粘贴在该表中。因此,当您插入记录时,还要对服务器表执行更新并为该服务器设置current_failure_count = current_failure_count + 1
。这样你只需要读取服务器表中的一条记录(我假设为server_id
索引)并且你已经设置好了。不,这不遵循任何规范化规则,但您正在寻求速度,如果您可以控制客户端软件,这是获得它的最佳方式。
如果您无法控制客户端软件,也许您可以将记录插入到故障表中的触发器增加服务器表中的current_failure_count
值。这应该也可以。