首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化SQL以获取行数

优化SQL以获取行数
EN

Stack Overflow用户
提问于 2016-10-16 21:14:24
回答 5查看 101关注 0票数 2

我在我的网站上有一个页面,用来跟踪访问它的人数,在另一个部分,我显示了包含访问该页面的用户信息的数据,它一次只显示大约10个。

问题是我需要创建分页,所以我需要知道每次我的表上有多少数据,这会导致显示页面花费一些时间加载2-3秒,有时是7-10秒,因为我有数百万条记录。我想知道,怎样才能让这个页面加载得更快。

Select COUNT(*) as Count from visits

EN

回答 5

Stack Overflow用户

发布于 2016-10-16 21:30:06

我的第一反应是。。。如果您一次分页10条记录,为什么需要超过一百万条记录的总数?

其次,计算一百万行的时间不应该很长,除非您的行很宽(很多列或宽列)。如果是这样的话,那么:

代码语言:javascript
复制
select count(id) from t;

可以有所帮助,因为它将显式地使用索引。请注意,由于缓存的原因,第一次运行可能比后续运行慢。

如果您决定确实需要精确的行数,那么使用MySQL加速它的唯一实际选择是创建触发器以在另一个表中维护计数。但是,这将减慢插入和删除的速度,这可能不是一个好主意。

票数 1
EN

Stack Overflow用户

发布于 2016-10-17 12:21:48

最好的答案是“大约1234,000次访问”,而不是确切的数字。然后每天计算它(或其他)。

但如果你一定要知道确切的数字...

如果这个表是“只写的”,那么有一个解决方案。它涉及到将其视为数据仓库中的“事实”表。然后创建并维护一个“汇总表”,每小时占一行。然后COUNT变成:

代码语言:javascript
复制
SELECT SUM(hourly_count) FROM SummaryTable;

这将会快得多,因为需要扫描的东西要少得多。但是,存在一个问题,因为它不包括最后(部分)小时的计数。但是,如果您使用INSERT ... ON DUPLICATE KEY UPDATE ...递增当前小时的计数器或插入一个带有"1“的新行,就可以解决这个问题。

更多信息请访问。

但是,在我们走得太远之前,请告诉我们新的“访问”发生的频率。

票数 1
EN

Stack Overflow用户

发布于 2016-10-16 21:20:53

如果不更改服务器的硬件或添加更多的服务器来并行运行该查询,则无法使该查询变得更快。在第二种情况下,最好转移到nosql数据库。

我的方法是减少记录的数量。您可以使用一些临时表来记录过去一小时/一天的访问日志,然后运行一个cronjob来删除数据,或者将其移动到另一个表中以存储日志项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40070657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档