求教SQL语句优化

yalan 2020-03-01 02:08:56
千万行的表,快到亿了,使用 in 字句要崩溃啊,求优化方法。

表结构简述如下:
id,username,regtime,loginip,logindatetime

想要检索出登录10次以上的用户,现在用的语句是:
select * from table where username in (select username from table group by username having count(*)>10)

如果加上条件,要检索出某天登录10次以上、来自某几个IP的用户,更慢:
select * from table where username in (select username from table group by username having count(*)>10) and date(logindatetime)='2019-12-12' and loginip in('1,1,1,1','2.2.2.2','3.3.3.3')

折腾了半天,快崩溃了。。。求优化
...全文
197 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yalan 2020-03-02
  • 打赏
  • 举报
回复
引用 6 楼 csdn_castiel 的回复:
select username from table where logindatetime='2019-12-12' and loginip in('1,1,1,1','2.2.2.2','3.3.3.3') group by username having count(*)>10 联合索引(logindatetime,loginip,username) logindatetime='2019-12-12'此处不要用时间函数,要用也放右边 得到的username存入临时表tmp_table 最后 select * from tmp_table a join table b on a.username=b.username
感谢大家帮助,最后还是分表解决的
stonecutter 2020-03-02
  • 打赏
  • 举报
回复
select username from table group by username having count(*)>10
此表肯定是全表扫描,要想快就是加大buffer_pool或者减少表的数据量(分表)。
ACMAIN_CHM 2020-03-01
  • 打赏
  • 举报
回复
explain select * from table where username in (select username from table group by username having count(*)>10) and date(logindatetime)='2019-12-12' and loginip in('1,1,1,1','2.2.2.2','3.3.3.3') 结果贴出来分析一下。 还有相关表的 show index 也贴出来。
csdn_castiel 2020-03-01
  • 打赏
  • 举报
回复
select username from table where logindatetime='2019-12-12' and loginip in('1,1,1,1','2.2.2.2','3.3.3.3') group by username having count(*)>10 联合索引(logindatetime,loginip,username) logindatetime='2019-12-12'此处不要用时间函数,要用也放右边 得到的username存入临时表tmp_table 最后 select * from tmp_table a join table b on a.username=b.username
yalan 2020-03-01
  • 打赏
  • 举报
回复
引用 4 楼 liangtu 的回复:
登录时间上加索引,查询时用 >= '2020-03-01 00:00:00' and <'2020-03-02 00:00:00'
试了下基本没改善 我觉得效率低主要在 in 字句,尤其是加了检索条件后有两个 in 字句,效率更差啊
liangtu 2020-03-01
  • 打赏
  • 举报
回复
登录时间上加索引,查询时用 >= '2020-03-01 00:00:00' and <'2020-03-02 00:00:00'
yalan 2020-03-01
  • 打赏
  • 举报
回复
补充:每个月的登录次数就要几千万行了 我想问在现有表的前提下如何优化查询呢?现在唯一能做的权限就是给表加个索引啥的,唉
yalan 2020-03-01
  • 打赏
  • 举报
回复
登录表只有一张表,每个月自动生成一张表,比如201910 201911 201912。。。。 不定啥时候需要查询用户,查询哪些天也不定,所以有点头疼 表的结构就是我一楼的结构, id 主键 username key
liangtu 2020-03-01
  • 打赏
  • 举报
回复
你这张表应该是登录日志表,有几个问题需要确认 1.是否所有记录都在一张表内,没有按照时间分表 2.建表语句、索引语句都贴出来 3.查询登录10次以上的用户,多久查询一次,一般查询哪些天的?

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧