数据库
首页 > 数据库> > mysql – 在同一查询中获得第95百分位数和求和的任何方法?

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