mysql – 在同一查询中获得第95百分位数和求和的任何方法?
作者:互联网
我有一个很大的MySQL表,即使正确编制索引,每个查询也需要1秒钟(听起来不是很多,但它运行的是数千台服务器).现在,我有四个查询通过获得第95百分位入站,第95百分位出站,以及两者的总和.
查询1:获取行数以获得第95百分位行
SELECT round(count(*)*.95 FROM traffic WHERE server_id = 1;
查询2和3获得第95百分位数
SELECT inbound FROM traffic WHERE server_id = 1 ORDER BY inbound ASC LIMIT {95th},1
SELECT outbound FROM traffic WHERE server_id = 1 ORDER BY outbound ASC LIMIT {95th},1
查询4获取流量总和
SELECT sum(inbound+outbound) FROM traffic WHERE server_id = 1;
你能想出我能把这些结合起来的方式吗?因为我需要获得第95个百分位,所以通过根据计数选择特定行来计算,我被挑战想到一种方法.例如,如果有10000行,则按升序排序并选择第9500行.
解决方法:
如http://planet.mysql.com/entry/?id=13588所述:
SELECT
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT(
t.inbound
ORDER BY t.inbound
SEPARATOR ','
)
, ','
, 95/100 * COUNT(*) + 1
)
, ','
, -1
) AS `Inbound95`
,
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT(
t.outbound
ORDER BY t.outbound
SEPARATOR ','
)
, ','
, 95/100 * COUNT(*) + 1
)
, ','
, -1
) AS `Outbound95`
FROM traffic AS t WHERE t.server_id = 1
会给你两个百分位数
注意:您可能需要增加group_concat_max_len
标签:performance,sql,mysql,database,percentile 来源: https://codeday.me/bug/20190831/1775469.html