免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1595 | 回复: 6
打印 上一主题 下一主题

【已解决】求助这个查询语句该怎么优化,现在的要2个多小时... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-25 17:00 |只看该作者 |倒序浏览
本帖最后由 cenalulu 于 2012-06-26 17:47 编辑

select *  from (select Id,Name,Point
                       from account
                               where Id in (select Id from list) and ConnectTime >= '2012-06-10 00:00:00' and ConnectTime <= '2012-06-23 00:00:00'
                       order by ConnectTime desc) a group by Id order by Point desc limit 1000;

我自己写的这条语句是查询:
where Id in (select Id from list) 用这里面list表里的用户ID (一共3万多条),去account里面查询这些ID对应的用户名Name和点数Point,(登录的时间ConnectTime的限定是6月10日至6月23日),把点数Point最多的前1000人列出来

list表里就3万条ID,account表是只要一个用户登录一次,就记录对应的一条信息(所以数据量也是上万),所以我先按时间排,再group by ID,这样就列出这个用户最后一次登录的那条信息,然后再按这些数据里谁的Point大,就排出1000条。

现在问题是我这条语句效率太低,要2小时才能列出,请问高手们,这条语句如何优化?

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
2 [报告]
发表于 2012-06-25 18:02 |只看该作者
先撇去索引不说,当前的SQL可以简化成这样

select Id,Name,Point , max(ConnectTime)
from account
      where Id in (select Id from list) and ConnectTime >= '2012-06-10 00:00:00' and ConnectTime <= '2012-06-23 00:00:00'
group by Id order by Point desc limit 1000;

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
3 [报告]
发表于 2012-06-25 18:07 |只看该作者
1. 为了能更有效的利用索引,在account上最好有ConnectTime的索引(你的例子中,时间是一个很强的过滤条件),或者按照时间分区亦可。
2. 同时在select中加上force index (由于日志数量很大,mysql优化器很有可能忽略上面说的索引)

综上:优化后的语句, 红色部分改成你connecttime的索引的名字
select a.* from
(
select Id,Name,Point , max(ConnectTime)
from account force index (ConnectTime_index_name )
      where  ConnectTime >= '2012-06-10 00:00:00' and ConnectTime <= '2012-06-23 00:00:00'
group by Id order by Point desc limit 1000
) a
join  list
on a.Id = list.Id ;

论坛徽章:
0
4 [报告]
发表于 2012-06-25 18:28 |只看该作者
回复 3# cenalulu
先谢过了,万分感谢,我对索引没操作过这之前,我现在就去试试。


   

论坛徽章:
8
综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-09-14 06:20:00金牛座
日期:2014-10-10 11:23:34CU十二周年纪念徽章
日期:2013-10-24 15:41:34酉鸡
日期:2013-10-19 10:17:1315-16赛季CBA联赛之北京
日期:2017-03-06 15:12:44
5 [报告]
发表于 2012-06-26 15:10 |只看该作者
in改成join基本是通行法则了

论坛徽章:
0
6 [报告]
发表于 2012-06-26 17:17 |只看该作者
回复 3# cenalulu
用过回来了,建了索引,不用in,从2小时变成20秒了,由于这几天比较忙,到现在才回复,抱歉了,再次万分感谢!学到好东西!


   

论坛徽章:
224
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:1015-16赛季CBA联赛之四川
日期:2023-07-25 16:53:45操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
7 [报告]
发表于 2012-06-28 19:21 |只看该作者
哦,join性能怎么好??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP