根据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秒,即使该用户有几行(访问量).
应用指数后,情况有所好转,但问题是:
- 如果我访问
C9XzpOxWtuh893z1GFB2sD4BIko2
个人资料 - 如果我访问
I2I7CZParyMatRKnf8NiByujQ0F3
个人资料 - 等
只有几行(访问)的用户将很幸运,因为他的个人资料加载速度更快.
我可以忽略上面的所有内容,并在USERS表中创建一列来计算用户访问量,并在捕获新访问时增加访问量,而不创建数百万行,但这对我不起作用,因为我允许用户像这样过滤访问量:
Last 60 minutes
Last 24 hours
Last 7 days
Last 30 days
Last 6 months
Last 12 months
All-time
我该怎么办?