【发布时间】:2021-12-24 17:54:51
【问题描述】:
表名称:帐户
| AccountId | RegDate | Name | password |
|---|---|---|---|
| A | 20211101 | Rosa | 1234 |
| B | 20211102 | Daisy | 2345 |
| C | 20211103 | Holly | 3456 |
表名:account_history
| AccountId | LoginTime | Os | browser |
|---|---|---|---|
| A | 202111011303 | mac | safari |
| B | 202111011406 | window | chrome |
| C | 202111012507 | android | chrome |
| A | 202111051903 | mac | safari |
| B | 202111051806 | window | chrome |
| C | 202111052707 | android | chrome |
| A | 202111061603 | mac | safari |
| B | 202111061406 | window | chrome |
| C | 202111072007 | android | chrome |
| A | 202111087303 | mac | safari |
| B | 202111088406 | window | chrome |
| C | 202111089507 | android | chrome |
我想要的结果。
| AccountId | RegDate | LatestLoginTime | os |
|---|---|---|---|
| A | 20211101 | 2021202111087303101 | 202111087303 |
| B | 20211102 | 202111088406 | 202111088406 |
| C | 20211103 | 202111089507 | android |
我用过
SELECT a.AccountId,a.RegDate,b.LatestLoginTime,b.Os
FROM account a
LEFT JOIN (SELECT MAX(LoginTime) as LatestLoginTime,AccountId,Os
FROM accounthistory GROUP BY AccountId) b
ON a.AccountId = b.AccountId
但是这个查询太慢了。如何快速获得我想要的数据?
【问题讨论】:
-
之前尝试使用关键字
EXPLAIN运行查询,以便数据库解释查询是如何执行的,并有助于找到优化它的方法。你可以阅读更多here。 -
添加
show create table语句显示表索引 -
在以下 SO 问题中列出了大约 6 种不同的解决方案:stackoverflow.com/questions/7745609/… 您也可以尝试这些解决方案。
-
您可以尝试使用选择数据创建另一个表。您的表
account_history它是源日志,如果您用于特定网格,则需要创建account_last_activity其中与表account_history相同的列。 -
就像是
INSERT INTO t1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;docs
标签: mysql mariadb query-optimization