根据this question,答案是正确的,并使查询更好,但不能解决整个问题.

CREATE TABLE `USERS` (
 `ID` char(255) COLLATE utf8_unicode_ci NOT NULL,
 `NAME` char(255) COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

USERS表中只有5行.

ID NAME
C9XzpOxWtuh893z1GFB2sD4BIko2 ...
I2I7CZParyMatRKnf8NiByujQ0F3 ...
EJ12BBKcjAr2I0h0TxKvP7uuHtEg ...
VgqUQRn3W6FWAutAnHRg2K3RTvVL ...
M7jwwsuUE156P5J9IAclIkeS4p3L ...
CREATE TABLE `VISITS` (
 `USER_ID` char(255) COLLATE utf8_unicode_ci NOT NULL,
 `VISITED_IN` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
 KEY `USER_ID` (`USER_ID`,`VISITED_IN`),
 CONSTRAINT `VISITS_ibfk_1` FOREIGN KEY (`USER_ID`) REFERENCES `USERS` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

访问表中的索引:

Keyname Type Unique Packed Column Cardinality Collation Null Comment
USER_ID BTREE No No USER_ID
VISITED_IN
3245
5283396
A
A
No
No

访问表中有5740266行:

C9XzpOxWtuh893z1GFB2sD4BIko2 = 4,359,264 profile visits
I2I7CZParyMatRKnf8NiByujQ0F3 = 1,237,286 profile visits
EJ12BBKcjAr2I0h0TxKvP7uuHtEg = 143,716 profile visits
VgqUQRn3W6FWAutAnHRg2K3RTvVL = 0 profile visits
M7jwwsuUE156P5J9IAclIkeS4p3L = 0 profile visits

查询所用的时间:(秒数将根据行数变化)

SELECT COUNT(*) FROM VISITS WHERE USER_ID = C9XzpOxWtuh893z1GFB2sD4BIko2
  • 在应用Rick James的答案之前,查询耗时90到105秒
  • 应用里克·詹姆斯的答案后,查询耗时55到65秒
SELECT COUNT(*) FROM VISITS WHERE USER_ID = I2I7CZParyMatRKnf8NiByujQ0F3
  • 在应用Rick James的答案之前,查询耗时90到105秒
  • 应用Rick James的答案后,查询耗时20到30秒
SELECT COUNT(*) FROM VISITS WHERE USER_ID = EJ12BBKcjAr2I0h0TxKvP7uuHtEg
  • 在应用Rick James的答案之前,查询耗时90到105秒 After applying Rick James' answer, The query took between 4 to 8 seconds
SELECT COUNT(*) FROM VISITS WHERE USER_ID = VgqUQRn3W6FWAutAnHRg2K3RTvVL
  • 在应用Rick James的答案之前,查询耗时90到105秒
  • 应用Rick James的答案后,查询耗时1到3秒
SELECT COUNT(*) FROM VISITS WHERE USER_ID = M7jwwsuUE156P5J9IAclIkeS4p3L
  • 在应用Rick James的答案之前,查询耗时90到105秒
  • 应用Rick James的答案后,查询耗时1到3秒

正如您在应用索引之前所看到的,计算特定用户的访问量需要90到105秒,即使该用户有几行(访问量).

应用指数后,情况有所好转,但问题是:

  1. 如果我访问C9XzpOxWtuh893z1GFB2sD4BIko2个人资料
  2. 如果我访问I2I7CZParyMatRKnf8NiByujQ0F3个人资料

只有几行(访问)的用户将很幸运,因为他的个人资料加载速度更快.

我可以忽略上面的所有内容,并在USERS表中创建一列来计算用户访问量,并在捕获新访问时增加访问量,而不创建数百万行,但这对我不起作用,因为我允许用户像这样过滤访问量:

Last 60 minutes
Last 24 hours
Last 7 days
Last 30 days
Last 6 months
Last 12 months
All-time

我该怎么办?

推荐答案

这不是答案,而是一个建议.

  1. 如果不需要实时数据,

注意:如果您需要时间登录计数,我们可以在表中添加sync time列.(然后您的汇总表也会动态增加)

表列ex:

PK\U列、用户ID、就诊次数、sync\u时间

  1. 我们可以为您的前端使用异步(react 式)实现.这意味着,数据将在一段时间后加载,但用户在工作中永远不会遇到这种延迟.

  2. 创建一个汇总表,每天上午12:00运行一个作业(job),并将用户信息和上次访问的日期信息放入该表中.

user\u visit\u汇总表:

Note: Create indexes for User ID and the Date fields

检索数据时,将通过DB函数访问它

Select count(*) +  (Select Number_of_Visites from VISITS 
where user_id = xxx were VISIT_Date <= ['DATE 12:00 AM' -1]   PK_Column desc limit 1)  as old_visits
where USER_ID = xxx and VISITED_IN > 'DATE 12:00 AM';

Mysql相关问答推荐

在联合查询中使用GROUP BY和ORDER BY

MySQL 8.0.34-从后端系统管理AWS RDS上的持久连接内存使用

在MySQL中使用FIRST_VALUE()

带有值分隔的MySQL分组不起作用

MySQL 关于 JSON 数组和子查询的问题

即使在某些表中不匹配,如何从 MySQL 中的多个表中 Select 所有记录

如何编写按天数汇总值的sql查询?

分别针对每个不同的列 Select 聚合

MySQL DISTINCT 日期仅返回特定表的 1 个值.相同的查询适用于其他表

MYSQL除以零警告,奇怪的行为

通过 Gorm 查询模型

用两个新列制作表格,按偶数或奇数对另一列进行分类,并将一个类别中的所有偶数和奇数相加

添加一个日期字段大于另一个日期字段的要求

如何过滤表格,以便它显示最新的数据?

为什么 ORDER BY 'id' 'desc' 不返回语法错误?

如何在 Windows 上访问 xampp 的命令行

当您无法修复表时,如何修复 MySQL不正确的密钥文件错误?

如何将 MySQL 5.7 更新到新的 MySQL 8.0?

外键可以引用非唯一索引吗?

如何将数组存储到mysql中?