我使用SQL COUNT查询,但查询成本要高得多。表中添加了索引,但对查询成本没有影响。查询:
SELECT COUNT(direction) AS directionCount, direction, destination_addr, record_timestamp
FROM traffic_direction WHERE destination_addr='10.255.2.11'
GROUP BY destination_addr, direction ORDER BY record_timestamp DESC limit 10
使用Explain获取查询成本,该成本为:
"cost_info": {
"query_cost": "14158682.20"
}
首先,您的查询格式不正确,应该返回语法错误。为什么?SELECT
与GROUP BY
不一致——因为record_timestamp
未聚合。因此,将查询写成:
SELECT COUNT(*) AS directionCount, direction,
destination_addr, MAX(record_timestamp)
FROM traffic_direction
WHERE destination_addr = '10.255.2.11'
GROUP BY destination_addr, direction
ORDER BY record_timestamp DESC
LIMIT 10;
不过,这不会影响性能。
你唯一能做的就是在traffic_direction(destination_addr, direction, record_timestamp)
上创建一个索引。
MySQL可能不会将其用于GROUP BY
,并且您仍然会为ORDER BY
带来排序的开销。但它将有助于过滤数据,并消除访问数据页面的需要。