如何解决优化超过 10 万条记录的 MySQL 查询
我希望您帮助我优化此查询。
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,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
我正在创建一个网络流量跟踪器。 我有一个名为“stats”的表,我保存在那里; VIEWS、ASN、IP、broWSER、DEVICE等,其中包括“运营商”,即互联网服务提供商
我想要的是查看每个运营商的访问次数、帐户重复多次、唯一访问次数有多少。
我的代码已经做了我想要的,但它只在记录很少时才有效,现在我有超过 10 万条记录,服务器崩溃了,它不加载查询,我什至不得不重新启动 apache。
>这里我只留下说明性的图片
有什么办法可以加快查询速度吗?
预先感谢您的意见和帮助。
解决方法
您可以使用 Mysql OffSet 和 LIMIT 来实现
您可以尝试使用 ajax,首先加载 1500 条记录,滚动或单击下一个加载下 1500 条记录,使用数据表,它具有内部分页 + 附加下一个按钮以获得更多结果, 例如在 第一页偏移量 = 0,限制 = 1500 第二页偏移量 = 1500 ,限制为 1500 .. 依此类推
,** views
用作数字。如果是这种情况,请不要使用 VARCHAR
。建议 INT UNSIGNED
(最高为 40 亿)。
** 使用合理的限制而不是 varchar(1000)
。
** 越小越快。所以...规范化经常重复的列。 carrier
有大约 9 个不同的值? SMALLINT UNSIGNED
只需要 2 个字节,并且有足够的空间来处理整个载波。 varchar(1000)
的大部分内容也是如此。
** 建议使用标准的 2 个字母的“country_code”(CHAR(2)
) 而不是 country(100)
-- IN、US、UK、FR、...
** 专为加速查询而改
KEY `id_link` (`id_link`),
到
KEY `id_link` (`id_link`,carrier),
** 考虑将 WITH ROLLUP
与 GROUP BY
一起使用,这样您就不需要 UNION
和第二个 SELECT
。
** 考虑构建和维护一个包含每日小计的“汇总表”。查询此表将比查询您当前拥有的原始(“事实”)表快得多。更多信息:http://mysql.rjweb.org/doc.php/summarytables。 (这扩展了 Shubham 在评论中提到的内容。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。