`

MySQL关联查询优化实例

 
阅读更多
原文地址: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性能优化实例.pdf

    在处理大型项目时,数据库的性能优化至关重要,尤其是像MySQL这样的关系型数据库管理系统,需要优化的方面包括体系结构、设计、系统、配置以及查询语句。本实例分析了一份大型移动项目的MySQL数据库性能优化过程,...

    php+mysql动态网站开发实例 源码

    10. **性能优化**:如何使用缓存技术(如Memcached或Redis)、优化查询和索引,以提升网站性能。 这个压缩包中的"067371c44f4f47518358f2a1d86af2b4"可能是一个文件或目录,具体的功能和内容需要解压后查看。通过...

    MYSQL连接数据库实例

    在本文中,我们将深入探讨如何连接到MySQL数据库,提供实例教程,以便更好地理解和实践。 首先,了解MySQL连接的基础知识至关重要。连接到MySQL数据库通常涉及以下四个核心元素: 1. **服务器地址(Host)**:这是...

    mysql多表联合查询操作实例分析

    MySQL的多表联合查询是数据库操作中非常重要的一个概念,特别是在处理复杂的数据关系时,能够有效地从多个表中提取所需信息。本篇文章将深入探讨这一主题,通过实例分析来阐述其语法、功能以及操作技巧。 首先,让...

    mysql关联子查询的一种优化方法分析

    本文实例讲述了mysql关联子查询的一种优化方法。分享给大家供大家参考,具体如下: 很多时候,在mysql上实现的子查询的性能较差,这听起来实在有点难过。特别有时候,用到IN()子查询语句时,对于上了某种数量级的表...

    用于oracle,mysql,sqlserver,数据库分页联合查询

    本话题主要聚焦于如何在Oracle、MySQL和SQL Server这三种主流关系型数据库中实现分页联合查询。 首先,我们来看Oracle数据库的分页查询。Oracle使用ROWNUM关键字来实现分页。例如,如果我们想获取第10到20条记录,...

    PHP+MySQL 电子商城网站实例

    - **MySQL** 存储所有数据,利用索引优化查询速度,保证数据一致性。 - **HTML/CSS/JavaScript** 用于前端页面的布局和交互,可以配合**Bootstrap** 或其他前端框架提升用户体验。 - **AJAX** 实现异步数据交换,...

    MySQL联合索引功能与用法实例分析

    MySQL联合索引,也称为复合索引,是提高数据库查询性能的重要工具。它允许在一个索引中同时包含多个列,从而使得查询能够更快地定位到所需的数据行。联合索引的关键在于其列的顺序,因为MySQL会从左到右依次使用索引...

    MySQL 5.1中文手冊

    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子查询用法实例分析

    MySQL提供了多种子查询类型,包括标量子查询、关联子查询、存在子查询等。在实际使用中,可以根据需求灵活选择合适的子查询类型。例如,当需要判断某值是否在另一查询的结果集中时,可以使用`IN`或`NOT IN`操作配合...

    Mysql自连接查询实例详解

    MySQL自连接查询是一种特殊的连接查询方式,它将同一个表视为两个不同的实体进行连接,从而实现对自身数据的关联。在数据库设计中,特别是在处理层级结构数据时,自连接查询非常有用。例如,上述实例中提到的产品...

    MySQL查询优化:用子查询代替非主键连接查询实例介绍

    总之,用子查询代替非主键连接查询是MySQL查询优化的一个有效手段,尤其适用于数据量大且关联字段不是主键的情况。这种方法通过减少数据扫描和优化查询顺序,可以显著提升查询性能。在实际的数据库设计和开发中,...

    Mysql\学习笔记\mysql优化

    MySQL优化是数据库管理中至关重要的一个环节,目的是提高查询速度,减少资源消耗,进而提升整体系统性能。本文主要从数据库设计的三个范式和SQL优化技巧两个方面进行讲解。 首先,我们来了解一下数据库设计的三个...

    MySQL基础PDF版

    关系型数据库通过外键关联表与表之间的关系,而非关系型数据库则以对象形式存储数据,依赖对象自身属性来决定关系。 2. **MySQL基础** - **DBMS**:数据库管理系统(DataBase Management System),如MySQL,用于...

    MySQL嵌套查询实例详解

    本文将深入探讨MySQL中的嵌套查询,包括其使用技巧、实例分析以及注意事项。 1. 子查询语法 子查询可以在`SELECT`、`FROM`或`WHERE`子句中使用。基本的子查询结构如下: ```sql SELECT ... FROM (subquery) AS ...

    mfc 下界面编程实例和mysql实例

    10. **性能优化**:最后,你可能还需要学习如何优化SQL查询性能,如使用索引、避免全表扫描、合理设计数据库表结构等。 通过这个实例,你不仅可以熟悉MFC界面编程,还能深入了解如何在C++应用中高效地操作MySQL...

    学生成绩管理系统(MySQL+JSP)实例源码下载

    【学生成绩管理系统(MySQL+JSP)实例源码下载】是一个基于Web的教育信息化解决方案,主要用于管理和跟踪学生的学术成绩。这个系统结合了MySQL数据库管理系统和JavaServer Pages (JSP)技术,为学校教务部门提供了一个...

Global site tag (gtag.js) - Google Analytics