我在我的网站上有一个页面,用来跟踪访问它的人数,在另一个部分,我显示了包含访问该页面的用户信息的数据,它一次只显示大约10个。
问题是我需要创建分页,所以我需要知道每次我的表上有多少数据,这会导致显示页面花费一些时间加载2-3秒,有时是7-10秒,因为我有数百万条记录。我想知道,怎样才能让这个页面加载得更快。
Select COUNT(*) as Count from visits
发布于 2016-10-16 21:30:06
我的第一反应是。。。如果您一次分页10条记录,为什么需要超过一百万条记录的总数?
其次,计算一百万行的时间不应该很长,除非您的行很宽(很多列或宽列)。如果是这样的话,那么:
select count(id) from t;可以有所帮助,因为它将显式地使用索引。请注意,由于缓存的原因,第一次运行可能比后续运行慢。
如果您决定确实需要精确的行数,那么使用MySQL加速它的唯一实际选择是创建触发器以在另一个表中维护计数。但是,这将减慢插入和删除的速度,这可能不是一个好主意。
发布于 2016-10-17 12:21:48
最好的答案是“大约1234,000次访问”,而不是确切的数字。然后每天计算它(或其他)。
但如果你一定要知道确切的数字...
如果这个表是“只写的”,那么有一个解决方案。它涉及到将其视为数据仓库中的“事实”表。然后创建并维护一个“汇总表”,每小时占一行。然后COUNT变成:
SELECT SUM(hourly_count) FROM SummaryTable;这将会快得多,因为需要扫描的东西要少得多。但是,存在一个问题,因为它不包括最后(部分)小时的计数。但是,如果您使用INSERT ... ON DUPLICATE KEY UPDATE ...递增当前小时的计数器或插入一个带有"1“的新行,就可以解决这个问题。
更多信息请访问。
但是,在我们走得太远之前,请告诉我们新的“访问”发生的频率。
发布于 2016-10-16 21:20:53
如果不更改服务器的硬件或添加更多的服务器来并行运行该查询,则无法使该查询变得更快。在第二种情况下,最好转移到nosql数据库。
我的方法是减少记录的数量。您可以使用一些临时表来记录过去一小时/一天的访问日志,然后运行一个cronjob来删除数据,或者将其移动到另一个表中以存储日志项。
https://stackoverflow.com/questions/40070657
复制相似问题