首页 > 解决方案 > 加快最近的查询

问题描述

我正在尝试获取 3 个成功(成功 = 1)的最近记录,然后查看它们的平均响应时间。

我操纵了结果,使平均响应始终为 2 毫秒。

我现在在这个表中有 20,000 条记录,但我计划有 1-2 百万条记录。仅 20,000 条记录就需要 40 秒,因此我需要优化此查询。

这是小提琴:http ://sqlfiddle.com/#!9/dc91eb/1/0

小提琴也包含我的索引,所以如果需要,我愿意添加更多索引。


SELECT proxy, 
       Avg(a.responsems) AS avgResponseMs,
       COUNT(*) as Count
FROM proxylog a
WHERE  
        a.success = 1 
         AND ( (SELECT Count(0) 
                FROM   proxylog b 
                WHERE  ( ( b.success = a.success ) 
                         AND ( b.proxy = a.proxy ) 
                         AND ( b.datetime >= a.datetime ) )) <= 3 ) 
GROUP  BY proxy 
ORDER BY avgResponseMs

这是解释的结果

+----+--------------------+-------+-------+----------------+-------+---------+---------------------+-------+----------------------------------------------+
| id | select_type        | table | type  | possible_keys  | key   | key_len | ref                 | rows  | Extra                                        |
+----+--------------------+-------+-------+----------------+-------+---------+---------------------+-------+----------------------------------------------+
| 1  | PRIMARY            | a     | index | NULL           | proxy | 61      | NULL                | 19110 | Using where; Using temporary; Using filesort |
+----+--------------------+-------+-------+----------------+-------+---------+---------------------+-------+----------------------------------------------+
| 2  | DEPENDENT SUBQUERY | b     | ref   | proxy,datetime | proxy | 52      | wwwim_iroom.a.proxy | 24    | Using where; Using index                     |
+----+--------------------+-------+-------+----------------+-------+---------+---------------------+-------+----------------------------------------------+

在您建议窗口函数之前,我使用的是 MariaDB 10.1.21,即 ~Mysql 5.6 AFAIK

标签: mysqlsqloptimizationmysql-5.6

解决方案


上的索引(success, proxy, datetime, responsems)应该会有所帮助。successproxy并且datetime是两个查询之间共享的列。datetime应该在其他两个之后,因为它用于过滤一个范围,而其他两个过滤一个点。responsems排在最后,因为这是计算所在的列。这样可以直接从索引中获取所需的值。

请编辑问题并将 DDL 和 DML 也包含在问题本身中。小提琴可能有一天会失败,因此这个问题对未来的读者来说毫无用处。


推荐阅读