优化SQL以获取行数

时间:2016-10-16 13:14:24

标签: mysql sql performance query-optimization

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

问题是我需要创建分页因此我需要知道每次在我的表上有多少数据,这会导致显示页面需要一些时间来加载2-3秒,有时是7-10,因为我有数百万的记录。我想知道,如何让这个页面加载更快。

Select COUNT(*) as Count from visits

5 个答案:

答案 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