我的网站上有一个页面可以跟踪访问它的人数,另一部分我显示的数据包含访问该页面的用户信息,一次只显示大约10个。
问题是我需要创建分页因此我需要知道每次在我的表上有多少数据,这会导致显示页面需要一些时间来加载2-3秒,有时是7-10,因为我有数百万的记录。我想知道,如何让这个页面加载更快。
Select COUNT(*) as Count from visits
答案 0 :(得分:1)
我的第一反应是。 。 。如果您一次分页记录10,为什么总需要超过一百万?
其次,计算一百万行不应该花很长时间,除非你的行很宽(很多列或宽列)。如果是这种情况,那么:
select count(id) from t;
可以提供帮助,因为它会明确使用索引。请注意,由于缓存,第一次运行可能比后续运行慢。
如果您确定需要确切的行数,那么使用MySQL加速它的唯一真正选择是创建触发器以将计数保持在另一个表中。但是,这会减慢插入和删除速度,这可能不是一个好主意。
答案 1 :(得分:1)
最好的答案是说"大约1,234,000次访问",不是确切的数字。然后每天(或其他)计算它。
但如果你必须有确切的数,......
如果此表是"只写",那么就有一个解决方案。它涉及将其视为一个事实"数据仓库中的表。然后创建并维护一个"摘要表"例如,每小时一排。然后COUNT
变为:
SELECT SUM(hourly_count) FROM SummaryTable;
这会快得多,因为扫描的次数要少得多。但是,存在的问题是它不包括最后(部分)小时的计数。但是,如果您使用INSERT ... ON DUPLICATE KEY UPDATE ...
递增当前小时的计数器或使用" 1"插入新行,则可以解决此问题。
更多信息是here。
但是,在我们采取这个过程之前,请告知我们新访问的频率。发生。
答案 2 :(得分:0)
如果不更改服务器硬件或添加更多服务器以并行运行,则无法使查询变得更快。在第二种情况下,最好转移到nosql数据库。
我的方法是减少记录数量。您可以通过使用一些临时表来记录过去一小时/天的访问日志,然后运行删除数据的cronjob,或将其移动到另一个表以进行日志条件存储。
答案 3 :(得分:0)
您通常不需要知道分页的确切行数
SELECT COUNT(*) FROM
(SELECT TOP 10000 * FROM visits) as v
告诉你,至少有1000页。在大多数情况下,您不需要了解更多信息。
如果您想要一些合理的估算,您可以在某处存储总计数并不时更新。如果您需要确切的数字,可以使用触发器来保持实际。当然,更新的信息越多,越贵。
答案 4 :(得分:0)
从实际(业务要求)的角度决定限制(假设,最后1000个)。具有auto_increment index(id)或timestamp(createdon)。获取最多1000条记录
select count(*) from (select id from visits order by id desc limit 1000)
或者在客户端(php)抓取所有1000和count paginate(就好像你对mysql进行paginate仍然会通过这些记录):
select * from visits order by id desc limit 1000