记一次order by desc limit导致的查询慢

    昨天接到一个客户的问题,电脑上可以打开网站,在手机上确不能打开报500的错。首先登陆上客户的服务器查看环境apache+mysql+php,php和mysql的占用都比较高,按经验来说那就是mysql的问题了,登陆mysql用show processlist查看进程,发现一条查询一直在sending date

mysql> show processlist;
+------+------+-----------------+--------+---------+------+--------------+------
--------------------------------------------------------------------------------
----------------+
| Id   | User | Host            | db     | Command | Time | State        | Info

                |
+------+------+-----------------+--------+---------+------+--------------+------
--------------------------------------------------------------------------------
----------------+
| 1832 | root | localhost:53490 | NULL   | Query   |    0 | NULL         | show
processlist
                |
| 1842 | root | localhost:53508 | yungou | Query   |    4 | Sending data | selec
t a.id,a.q_user,a.q_showtime,a.thumb,a.title,a.q_uid,qishu,announced_type,q_end_
time ,(SELECT ` |
+------+------+-----------------+--------+---------+------+--------------+------
--------------------------------------------------------------------------------
----------------+
2 rows in set (0.00 sec)

明显不对啊,把这条语句单独拿出来执行也是慢得要死48s。

explain分析一下这条语句:

mysql> explain select a.id,a.q_user,a.q_showtime,a.thumb,a.title,a.q_uid,qishu,a
nnounced_type,q_end_time ,(SELECT `time` FROM `go_member_go_record` WHERE shopid
 = a.id ORDER BY `time` DESC LIMIT 1 ) as gm_time from `go_shoplist` as a where
`shenyurenshu` <=0 ORDER BY `gm_time` DESC LIMIT 4\G;
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: a
         type: range
possible_keys: shenyurenshu
          key: shenyurenshu
      key_len: 4
          ref: NULL
         rows: 945
        Extra: Using where; Using filesort
*************************** 2. row ***************************
           id: 2
  select_type: DEPENDENT SUBQUERY
        table: go_member_go_record
         type: index
possible_keys: shopid
          key: time
      key_len: 63
          ref: NULL
         rows: 1
        Extra: Using where
2 rows in set (0.00 sec)

一看type是range就悲剧了,慢是肯定的了,但是945条记录也不至于这么慢啊!!

没办法用简化法来定位错误,先去掉子查询,直接

select a.id,a.q_user,a.q_showtime,a.thumb,a.title,a.q_uid,qishu,announced_type,q_end_time from `go_shoplist` as a where `shenyurenshu` <=0 ORDER BY `gm_time` DESC LIMIT 4;

没有问题,速度杠杠的~~

那就是子查询的问题了哦,从哪里动刀呢?order by desc limit

首先去掉排序,查询杠杠的~~

然后想想order by desc limit 1怎么替代呢,这句的意思是查询最大的值,那我直接用max可以吗?马上修改

select a.id,a.q_user,a.q_showtime,a.thumb,a.title,a.q_uid,qishu,announced_type,q_end_time ,(SELECT MAX(`time`) FROM `go_member_go_record` WHERE shopid = a.id ) as gm_time from `go_shoplist` as a where `shenyurenshu` <=0 ORDER BY `gm_time` DESC LIMIT 4;

打开网站,哈哈,速度杠杠的~~

优秀的个人博客,低调大师

微信关注我们

原文链接:https://blog.51cto.com/shevastar/1851079

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。