为什么即使行数相差很大,查询仍需要相同的时间来获取数据?
P粉795311321
P粉795311321 2024-03-28 14:22:51
[MySQL讨论组]

我的 VISITS 表中有 29,938,766 行,该表如下所示

USER_ID (INT) VISITED_IN(DATETIME)
65 2020-08-26 07:57:43
1182 2019-03-15 02:46:48
1564 2015-07-04 10:59:44
73 2021-03-18 00:25:08
3791 2017-10-17 12:22:45
51 2022-05-02 19:11:09
917 2017-11-20 15:32:06
3 2019-12-29 15:15:51
51 2015-02-08 17:48:30
1531 2020-08-05 08:44:55
等等... 等等...

运行此查询时,需要 17-20 秒并返回 63,514(用户有 63,514 次访问)

SELECT COUNT(*) FROM VISITS WHERE USER_ID = 917

运行此查询时,需要 17-20 秒并返回 193(用户有 193 次访问)

SELECT COUNT(*) FROM VISITS WHERE USER_ID = 716

问题是,即使用户只有 3、50、70 或 1,000,000 次访问,查询 29,938,766 行始终需要 17-20 秒。

我认为问题是因为它正在循环所有行?

第二个查询必须比第一个查询更快。这取决于行数。但两个查询花费相同的时间!

您对我有何建议以避免此问题?


表结构


更新:这是一个新的建议场景:

当用户进入他或其他人的个人资料时,他可以看到个人资料访问次数,并且可以使用这种方式过滤访问

Last 24 hours
|
---> SELECT COUNT(*) FROM VISITS WHERE USER_ID = 5 AND VISITED_IN >= DATE_SUB(NOW(), INTERVAL 1 DAY);

Last 7 days
|
---> SELECT COUNT(*) FROM VISITS WHERE USER_ID = 5 AND VISITED_IN >= DATE_SUB(NOW(), INTERVAL 7 DAY);

Last 30 days
|
---> SELECT COUNT(*) FROM VISITS WHERE USER_ID = 5 AND VISITED_IN >= DATE_SUB(NOW(), INTERVAL 30 DAY);

All time
|
---> SELECT VISITS FROM USERS WHERE USER_ID = 5;

此外,我将创建一个每天执行此命令的重复事件。

DELETE FROM VISITS WHERE VISITED_IN <= DATE_SUB(NOW(), INTERVAL 30 DAY);

此外,在 VISITS 表中添加新行时,我将确保增加 VISITS 列。

UPDATE USERS SET VISITS = VISITS + 1 WHERE ID = 5

P粉795311321
P粉795311321

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号