`

SQL优化示例

阅读更多
一、distinct 、 union all 、 union 区别

1.问题SQL及改进SQL
-- 表结构,user_id c_user 分别添加了索引,且字段可空,varchar(32),编码UTF-8
-- 问题SQL
select count(c_user) from 
(select user_id as c_user from jr_td_project_invest union select c_user from p2p_td_project_invest ) as count_investor;
-- 改进后:
select count(distinct c_user) from 
(select distinct user_id as c_user from jr_td_project_invest union all select distinct c_user from p2p_td_project_invest ) as count_investor;


2.性能分析:
通过explain 查询结果显示:


其他指标基本相同,rows :MYSQL认为必须检查的用来返回请求数据的行数
改进后要比前者少了50%的数据量

3.原因分析:
  • distinct 取出重复数据
  • union all 合并不去除重复数据,即会列出所有的值,不进行合并
  • union 合并且去重,将两个集合合并后先排序distinct 去重,再 union all
  • explain 结果中 key_len:  编码为UTF-8,varchar 数据类型所占字节数为 字符长度n*3+2字节+1字节(索引字段为空+1字节) = 99

Union all 与 Union 区别
博文参考:
http://blog.csdn.net/jesseyoung/article/details/40427849
http://blog.csdn.net/liuxiaohuago/article/details/7075371

EXPLAIN select user_id as c_user from jr_td_project_invest ;




EXPLAIN select distinct user_id as c_user from jr_td_project_invest ;




distinct 使用后可以识别到索引;distinct 依然是查询索引中所有的数据
仅对索引进行查询(Index-only queries):如果查询的列都位于索引中,则不需要读取元组的值。
博文参考:
理解MySQL——索引与优化

前者:
两个子查询通过索引
两个大的集合通过 Union 合并并去重

后者:
将两个不含重复的数据的集合进行合并不去重,
再在合并后的集合中去重

4.经验总结
使用union 前考虑是否需要去重;如果需要改为 在单个查询中使用 distinct
合并时使用 union all

二、时间类型查询

1.问题SQL及业务逻辑

-- 有两处业务场景使用如下SQL
-- 签到日历列表查询,展示本月已签到天数
-- 当天是否已签到
-- 实现原理:DATE_FORMAT 函数中格式化时间部分为动态传入的参数,若查询列表,则%y-%m ;若查询某一天 %y-%m-%d 

SELECT
	CREATE_TIME,
	TYPE,
	POINT,
	POINT_PERIOD
FROM
	jf_user_point_record
WHERE
	1 = 1
AND USER_ID = ?
AND DATE_FORMAT(CREATE_TIME, ?) = ?
AND TYPE = ?
ORDER BY
	CREATE_TIME ASC


2.SQL优化

-- 拆分为两个SQL,按照上述的业务场景
-- 当天是否已签到,将查询到的DATE 与当天日期进行比较
SELECT CREATE_TIME FROM `jf_user_point_record`
WHERE 
USER_ID = ""
AND TYPE = ? 
ORDER BY RECORD_ID DESC LIMIT 1 ; 
-- 排序按照主键排序,主键有索引,且数据插入顺序递增,完全不可以不适用create_timem 作为排序条件

-- 列表查询
SELECT
	CREATE_TIME,
	TYPE,
	POINT,
	POINT_PERIOD
FROM
	jf_user_point_record
WHERE
	1 = 1
AND USER_ID = ?
AND CREATE_TIME >= #{} -- 当月1日的日期
AND TYPE = ?
ORDER BY
	RECORD_ID ASC
-- SQL中尽量避免使用函数在字段上,如果字段上添加了索引,使用函数会导致索引失效
-- 另外,比较当天的时间可以使用 CREATE_TIME like "2017-11-03%" 
-- 时间参数格式化在Service 层处理


3.经验总结
除必要的函数调用外不要在SQL中进行函数的处理,会影响效率

  • 大小: 39.8 KB
  • 大小: 8.8 KB
  • 大小: 8.8 KB
分享到:
评论

相关推荐

    SQL性能优化示例

    "SQL性能优化示例"这个资源专为开发人员和高级DBA设计,旨在提供实用的优化策略和代码实例。以下是关于SQL性能优化的一些关键知识点: 1. **查询优化**:SQL查询优化是最基础的性能提升手段。通过重构查询语句,...

    oracle+SQL优化实例.pdf

    oracle+SQL优化实例.pdf

    SQL优化指导示例2.pdf

    根据提供的文件内容,我们可以了解到文档《SQL优化指导示例2.pdf》主要讨论了在Vertica数据库系统中如何进行SQL语句的优化。Vertica是一个面向列的高性能分析数据库,特别适合于处理大规模数据集。本文的知识点涉及...

    sql2008 示例数据库

    这些示例数据库不仅提供了实践操作的机会,还能帮助用户了解如何设计和优化数据库结构,处理事务,以及如何使用SQL Server的高级特性。例如,你可以通过AdventureWorks学习如何定义表之间的关系,如何创建索引以提高...

    sql2000示例数据库

    在这个“sql2000示例数据库”中,我们看到几个重要的文件,它们分别是NORTHWND.LDF、PUBS_LOG.LDF、NORTHWND.MDF和PUBS.MDF。这些文件是SQL Server数据库的关键组成部分,下面将详细介绍它们的用途以及与SQL Server ...

    收获,不止SQL优化--抓住SQL的本质1

    - **全书总结**:本书不仅是一本关于SQL优化的技术书籍,更是引导读者进入SQL优化世界的指南。通过丰富的案例、实战经验和深入的技术探讨,帮助读者建立起从宏观到微观的优化思路,并最终达到“爽”的境界。 - **...

    SQLServer示例数据库脚本

    通过执行这些脚本并进行查询,你可以深入理解SQL Server的事务处理、索引优化、备份恢复、权限管理等高级特性。 总的来说,"SQLServer示例数据库脚本"是一个宝贵的资源,无论是初学者还是经验丰富的开发人员,都能...

    sql 编程示例学习,示例

    ### SQL编程示例详解 #### 标题与描述解析 本次分享的主题是“SQL编程示例学习”,旨在通过具体的代码示例帮助初学者理解和掌握SQL编程的基础知识和技术要点。SQL(Structured Query Language)是一种用于管理关系...

    SQL Server示例数据库

    SQL Server示例数据库是Microsoft SQL Server提供的一组预先构建的数据库,用于演示、学习和测试SQL Server的功能。这些数据库包含了各种复杂的数据结构和业务场景,让开发者和DBA能够更好地理解如何在实际环境中...

    sql2005 示例数据库

    在这个“sql2005 示例数据库”压缩包中,包含了几个经典的示例数据库,它们对于学习和理解SQL Server 2005的功能、数据管理和查询语言SQL具有极大的帮助。 首先,我们来看看主要的三个示例数据库: 1. **...

    mysql数据库sql优化

    ### MySQL数据库SQL优化 #### 一、SQL优化 在MySQL数据库管理中,SQL查询的性能直接影响到系统的响应时间和资源消耗。通过合理的SQL优化,可以显著提高数据处理速度,降低服务器负载,提升用户体验。 ##### 1.1 ...

    SQl2005示例数据库

    SQL Server 2005的示例数据库是为了帮助用户更好地理解和学习SQL Server的功能和用法而提供的实际数据库实例。下面将详细介绍这个示例数据库以及相关的知识点。 首先,SQL Server 2005的示例数据库通常包括多个预定...

    sql2012数据库示例

    这些示例通常涵盖查询、数据管理、存储过程、触发器、索引优化等多个方面,对于初学者和经验丰富的DBA(数据库管理员)来说都是宝贵的资源。 描述中提到,这是微软公司提供的SQL2012示例,适合需要进行实践操作的...

    《收获,不止SQL优化》一书的代码

    《收获,不止SQL优化》是一本专注于数据库性能优化的书籍,尤其关注Oracle数据库系统的SQL调优。这本书通过实例和深入的解析,帮助读者理解和掌握如何提升SQL查询的效率,从而优化整个数据库系统的性能。在阅读这...

    sqlserver 示例数据库

    SQL Server 示例数据库是微软SQL Server数据库管理系统中提供的一系列预设数据库,用于演示、学习和测试目的。这些数据库包含了各种真实世界的数据模型和业务场景,帮助用户了解如何在实际环境中设计、操作和优化...

    Microsoft SQL Server 2008技术内幕 T-SQL 查询 索引优化章节 示例数据库脚本

    Microsoft SQL Server 2008技术内幕 T-SQL 查询 一书中,第四章,索引优化章节的示例数据库脚本。

    SQL示例大全 V1.0

    ### SQL示例大全 V1.0 - 更新内容详解 #### 一、单表高性能分页存储过程 在数据库查询操作中,特别是在Web应用环境中,分页功能是非常常见且必要的。通常,当数据量非常大时,一次性加载所有的数据不仅会消耗大量...

    Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解

    本书是作者十年磨一剑的成果之一,深入分析与解剖Oracle SQL优化与调优技术,主要内容包括: 第一篇“执行计划”详细介绍各种执行计划的含义与操作,为后面的深入分析打下基础。重点讲解执行计划在SQL语句执行的生命...

    SQL Server 2005示例数据库

    通过深入研究和操作SQL Server 2005的AdventureWorks示例数据库,用户不仅可以掌握SQL语言的基本用法,还能了解到数据库设计、管理、性能优化等多个方面的重要知识,对于提升数据库管理和开发技能非常有帮助。

Global site tag (gtag.js) - Google Analytics