【发布时间】:2021-07-28 08:28:19
【问题描述】:
我希望你帮我优化这个查询。
SELECT carrier,
SUM(views) AS views,
SUM(views-1) AS repeated,
SUM(views >= 1) AS unique_views,
COUNT(1) AS total
FROM stats s1
WHERE id_link = 39
AND EXISTS (
SELECT *
FROM stats s2
where id_link = 39
AND s2.carrier = s1.carrier
LIMIT 1, 1 )
GROUP BY carrier
HAVING COUNT(1) >= 1
LIMIT 1,1
UNION
SELECT 'TOTAL' AS carrier,
SUM(views) AS views,
SUM(views-1) AS repeated,
SUM(views >= 1) AS unique_views,
COUNT(1) AS total
FROM stats s4
WHERE id_link = 39
AND EXISTS (
SELECT *
FROM stats s3
where s3.carrier = s4.carrier
LIMIT 1, 1 )
数据库:
CREATE TABLE `stats` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_link` int(11) NOT NULL,
`country` varchar(100) NOT NULL,
`ip` varchar(100) NOT NULL,
`views` varchar(1000) NOT NULL,
`asn` varchar(1000) NOT NULL,
`carrier` varchar(1000) NOT NULL,
`type` varchar(1000) NOT NULL,
`device` varchar(1000) NOT NULL,
`browser` varchar(1000) NOT NULL,
`fecha` datetime NOT NULL,
`referrer` varchar(2000) NOT NULL,
PRIMARY KEY (`id`),
KEY `id_link` (`id_link`),
CONSTRAINT `stats_ibfk_1` FOREIGN KEY (`id_link`) REFERENCES `campaigns` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=614606 DEFAULT CHARSET=utf8
我正在创建一个网络流量跟踪器。 我有一个名为“统计”的表格,我保存在那里; VIEWS、ASN、IP、BROWSER、DEVICE等,其中有“运营商”,即互联网服务商
我想看看每个运营商有多少访问,帐户重复多次,有多少唯一访问。
我已经完成了我想要的代码,但它仅在记录很少时才有效,现在我有超过 100k 条记录服务器崩溃,它不加载查询,我什至必须重新启动 apache。
这里我只留下一个说明性的图像
有什么方法可以加快查询速度?
提前感谢您的 cmets 和帮助。
【问题讨论】:
-
为了让任何人能够在这里为您提供帮助,我们需要更多信息,例如所有涉及的表的架构、示例数据和所有索引。如果您对源一无所知,则很难帮助优化查询。
-
你好,我已经添加了表结构,只涉及“stats”表
-
您想知道是否至少有 2 行?
EXISTS ( ... LIMIT 1,1)