微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

优化超过 10 万条记录的 MySQL 查询

如何解决优化超过 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。

>

这里我只留下说明性的图片

enter image description here

有什么办法可以加快查询速度吗?

预先感谢您的意见和帮助。

解决方法

您可以使用 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 ROLLUPGROUP BY 一起使用,这样您就不需要 UNION 和第二个 SELECT

** 考虑构建和维护一个包含每日小计的“汇总表”。查询此表将比查询您当前拥有的原始(“事实”)表快得多。更多信息:http://mysql.rjweb.org/doc.php/summarytables。 (这扩展了 Shubham 在评论中提到的内容。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?