【发布时间】:2020-07-10 18:33:30
【问题描述】:
我知道使用索引可以优化带有GROUP BY 或WHERE 子句的SQL。但是如何使用GROUP BY 和WHERE 优化SQL?请看我的情况。
我有一个表来存储流量数据并用它来绘制网络流量拓扑。下面是表结构:
DROP TABLE IF EXISTS `data`;
CREATE TABLE `data`
(
`sip` varbinary(16) DEFAULT NULL,
`dip` varbinary(16) DEFAULT NULL,
`app` char(96) DEFAULT NULL,
`up` bigint(20) DEFAULT NULL,
`down` bigint(20) DEFAULT NULL,
`dtime` datetime DEFAULT CURRENT_TIMESTAMP,
KEY `dtime` (`dtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
并在列dtime 上创建索引。
简化的SQL是
SELECT
INET6_NTOA(sip),
INET6_NTOA(dip),
app,
sum(up) AS up,
sum(down) AS down
FROM
`data`
WHERE
`data`.dtime > FROM_UNIXTIME(1583031879)
AND `data`.dtime < FROM_UNIXTIME(1585537477)
GROUP BY
sip,
dip,
app
该表可以存储大约10,000,000条一个月的记录,我们的要求是绘制一个粒度为Last 30 days, Last 24 hours, Last 1 hours的网络流量拓扑。
显然索引dtime 有助于查询最近1 小时或最近24 小时的数据。但是查询过去 30 天时,是全表扫描。
极端情况下,查询24小时耗时5s,可以接受,查询30天耗时60s+,难以接受。
为 sip,dip,app 创建索引?似乎没有帮助,因为我首先必须按 dtime 过滤数据。我搜索了各种索引解决方案,可能不适合我。
有什么想法可以加快我的 SQL 速度吗?或者有什么改进餐桌设计的想法吗?非常感谢。
【问题讨论】:
标签: mysql optimization indexing group-by