mysql - 加快最近的查询
问题描述
我正在尝试获取 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
解决方案
上的索引(success, proxy, datetime, responsems)
应该会有所帮助。success
,proxy
并且datetime
是两个查询之间共享的列。datetime
应该在其他两个之后,因为它用于过滤一个范围,而其他两个过滤一个点。responsems
排在最后,因为这是计算所在的列。这样可以直接从索引中获取所需的值。
请编辑问题并将 DDL 和 DML 也包含在问题本身中。小提琴可能有一天会失败,因此这个问题对未来的读者来说毫无用处。
推荐阅读
- javascript - 使用节点和javascript从xml文档中提取特定数据
- c# - 如何从 HTML 节点集合中获取特定的 span 标签
- apache-kafka - Kafka:用户如何通过菜单或决策树来选择多个选项?
- javascript - 更改 JavaScript 中的执行顺序
- python-3.x - 将函数应用于 Pandas 中的列会引发 AttributeError
- javascript - 在不使用 Sheets API 的情况下从 Google 表格中获取数据
- git - 该分支未显示为单独的分支
- java - 我将如何做到这一点,以便输出将四舍五入到小数点后两位?
- vtk - 使用 Vedo 从非结构化网格 vtk 文件创建曲面图
- r - RPostgreSQL 查询在 Shiny 服务器中不起作用