原文地址:http://www.linuxidc.com/Linux/2011-11/46585.htm
项目中发现有一个查询响应非常慢,花时间分析以及优化,特地记录。
(1)背景
项目采用MySQL数据库,操作使用Ibatis;
(2)查询说明
这个查询是每次查询一定数目的用户信息,查询中涉及到多表关联,具体查询SQL如下
<select id="select" parameterClass="UserCompany" resultClass="UserCompany">
SELECT S.NAME as name,
S.IMAGE as image,
S.ID as id,
C.NAME as companyName,
C.ID as companyId,
A.FILE_NAME AS resourceFileName,
A.FILE_PATH AS resourceFilePath,
A.FILE_ID AS resourceFileId,
COUNT(R.CONTACT) AS updResourceSize
from sys_user_info S
LEFT JOIN ATTACH_FILE_INFO A ON S.ID = A.USER_ID
LEFT JOIN
(SELECT RESOURCE_ID,CONTACT FROM company_resource_info
WHERE UPDTIME >= #UPDResourceTime:TIMESTAMP# ) R
ON S.ID = R.CONTACT,
company_info C
WHERE S.COMPANY_ID = C.ID
GROUP BY S.ID
LIMIT 15
</select>
注意其中用到了子查询,涉及到临时表
(3)分析过程
使用MySQL自带的profiler分析结果如下图
观察可得,99%的时间花在了拷贝数据到临时表上,也就是与其中的子查询有关系。
想来奇怪,如果只是LIMIT 15条数据,临时数据不应该花费这么多时间;个人觉得问题应该出在LIMIT对于里面的子查询无效,也就是里面的子查询会涉及到全部数据,从而导致临时表消耗很大的时间,这样就不难理解了。
(4)优化
想清楚了上面的原因,解决的思路也就比较清楚了,只要让里面涉及的子查询只查LIMIT对应的数据就可以了。
重新实行的方式如下:
<resultMap class="cn.com.steel.wuyou.model.UserCompany" id="UserCompanyMap">
<result property="name" column="name" />
<result property="image" column="image" />
<result property="id" column="id" />
<result property="companyName" column="companyName" />
<result property="companyId" column="companyId" />
<result property="resourceFileName" column="resourceFileName" />
<result property="resourceFilePath" column="resourceFilePath" />
<result property="resourceFileId" column="resourceFileId" />
<result property="UPDResourceTime" column="UPDResourceTime" />
<result property="updResourceSize" column="{CONTACT=id,udpResourceTime=UPDResourceTime}"
select="steel_userCompany.selectUpdResourceSize" />
</resultMap>
<select id="selectUpdResourceSize" parameterClass="java.util.HashMap"
resultClass="int">
SELECT COUNT(1) FROM company_resource_info
WHERE CONTACT = #CONTACT#
and UPDTIME >= #UPDResourceTime:TIMESTAMP#
</select>
<select id="select" parameterClass="UserCompany" resultMap="UserCompanyMap">
SELECT S.NAME as name,
S.IMAGE as image,
S.ID as id,
C.NAME as companyName,
C.ID as companyId,
A.FILE_NAME AS resourceFileName,
A.FILE_PATH AS resourceFilePath,
A.FILE_ID AS resourceFileId,
#UPDResourceTime:TIMESTAMP# as UPDResourceTime
from sys_user_info S
LEFT JOIN ATTACH_FILE_INFO A ON S.ID = A.USER_ID
LEFT JOIN company_info C ON S.COMPANY_ID = C.ID
LIMIT 15
</select>
主要的做法就是,每次先查出LIMIT 15条不含子查询结果的数据,定义一个resultMap映射结果集,针对每一条记录再去分别调用一次查询从而得到最后想要的结果。 linux
分享到:
相关推荐
在本实例讲解中,我们将深入探讨MySQL联合查询的基本概念、类型以及如何在实际场景中应用。 一、联合查询基本概念 联合查询允许我们从两个或更多个表中选取相关的数据行,并将结果合并成一个单一的结果集。这在处理...
在处理大型项目时,数据库的性能优化至关重要,尤其是像MySQL这样的关系型数据库管理系统,需要优化的方面包括体系结构、设计、系统、配置以及查询语句。本实例分析了一份大型移动项目的MySQL数据库性能优化过程,...
10. **性能优化**:如何使用缓存技术(如Memcached或Redis)、优化查询和索引,以提升网站性能。 这个压缩包中的"067371c44f4f47518358f2a1d86af2b4"可能是一个文件或目录,具体的功能和内容需要解压后查看。通过...
在本文中,我们将深入探讨如何连接到MySQL数据库,提供实例教程,以便更好地理解和实践。 首先,了解MySQL连接的基础知识至关重要。连接到MySQL数据库通常涉及以下四个核心元素: 1. **服务器地址(Host)**:这是...
MySQL的多表联合查询是数据库操作中非常重要的一个概念,特别是在处理复杂的数据关系时,能够有效地从多个表中提取所需信息。本篇文章将深入探讨这一主题,通过实例分析来阐述其语法、功能以及操作技巧。 首先,让...
本文实例讲述了mysql关联子查询的一种优化方法。分享给大家供大家参考,具体如下: 很多时候,在mysql上实现的子查询的性能较差,这听起来实在有点难过。特别有时候,用到IN()子查询语句时,对于上了某种数量级的表...
本话题主要聚焦于如何在Oracle、MySQL和SQL Server这三种主流关系型数据库中实现分页联合查询。 首先,我们来看Oracle数据库的分页查询。Oracle使用ROWNUM关键字来实现分页。例如,如果我们想获取第10到20条记录,...
- **MySQL** 存储所有数据,利用索引优化查询速度,保证数据一致性。 - **HTML/CSS/JavaScript** 用于前端页面的布局和交互,可以配合**Bootstrap** 或其他前端框架提升用户体验。 - **AJAX** 实现异步数据交换,...
MySQL联合索引,也称为复合索引,是提高数据库查询性能的重要工具。它允许在一个索引中同时包含多个列,从而使得查询能够更快地定位到所需的数据行。联合索引的关键在于其列的顺序,因为MySQL会从左到右依次使用索引...
7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. ...
MySQL提供了多种子查询类型,包括标量子查询、关联子查询、存在子查询等。在实际使用中,可以根据需求灵活选择合适的子查询类型。例如,当需要判断某值是否在另一查询的结果集中时,可以使用`IN`或`NOT IN`操作配合...
MySQL自连接查询是一种特殊的连接查询方式,它将同一个表视为两个不同的实体进行连接,从而实现对自身数据的关联。在数据库设计中,特别是在处理层级结构数据时,自连接查询非常有用。例如,上述实例中提到的产品...
总之,用子查询代替非主键连接查询是MySQL查询优化的一个有效手段,尤其适用于数据量大且关联字段不是主键的情况。这种方法通过减少数据扫描和优化查询顺序,可以显著提升查询性能。在实际的数据库设计和开发中,...
MySQL优化是数据库管理中至关重要的一个环节,目的是提高查询速度,减少资源消耗,进而提升整体系统性能。本文主要从数据库设计的三个范式和SQL优化技巧两个方面进行讲解。 首先,我们来了解一下数据库设计的三个...
关系型数据库通过外键关联表与表之间的关系,而非关系型数据库则以对象形式存储数据,依赖对象自身属性来决定关系。 2. **MySQL基础** - **DBMS**:数据库管理系统(DataBase Management System),如MySQL,用于...
本文将深入探讨MySQL中的嵌套查询,包括其使用技巧、实例分析以及注意事项。 1. 子查询语法 子查询可以在`SELECT`、`FROM`或`WHERE`子句中使用。基本的子查询结构如下: ```sql SELECT ... FROM (subquery) AS ...
10. **性能优化**:最后,你可能还需要学习如何优化SQL查询性能,如使用索引、避免全表扫描、合理设计数据库表结构等。 通过这个实例,你不仅可以熟悉MFC界面编程,还能深入了解如何在C++应用中高效地操作MySQL...
【学生成绩管理系统(MySQL+JSP)实例源码下载】是一个基于Web的教育信息化解决方案,主要用于管理和跟踪学生的学术成绩。这个系统结合了MySQL数据库管理系统和JavaServer Pages (JSP)技术,为学校教务部门提供了一个...