添加这些索引:
alter table users_logins
add key (iplogin, userid, logindate),
add key (userid, logindate);
现在演示您可以通过查找同一用户没有其他早期登录的登录来执行查询以获取每个用户的最早登录。
这是获得每个用户或其他任何东西的最大/最早条目的常见解决方案。
select t1.iplogin, count(*) as numberofaccounts
from users_logins as t1
left outer join users_logins as t2
on (t1.userid=t2.userid and t1.logindate > t2.logindate)
where t2.userid is null
group by iplogin\G
上面定义的索引有助于LEFT OUTER JOIN
和GROUP BY
。
EXPLAIN 报告显示这已经得到了很好的优化。它对两个表都使用了索引,并且不会导致临时表或文件排序,这通常是性能杀手。
它确实进行了索引扫描(type: index
),这意味着它读取了整个索引,但至少这不是表扫描。
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
partitions: NULL
type: index
possible_keys: iplogin
key: iplogin
key_len: 29
ref: NULL
rows: 1
filtered: 100.00
Extra: Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: t2
partitions: NULL
type: ref
possible_keys: userid
key: userid
key_len: 5
ref: test.t1.userid
rows: 1
filtered: 100.00
Extra: Using where