- 浏览: 145740 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (138)
- java基础 (26)
- 日常工作经验总结 (22)
- SVN学习与使用 (1)
- JBOSS学习与实践 (1)
- webService学习与实践 (4)
- redis学习与实践 (12)
- spring学习与实践 (0)
- hibernate学习与实践 (4)
- Struts2学习与实践 (0)
- mybatis学习与实践 (0)
- SpringMVC学习与实践 (0)
- jfreechart学习与使用 (0)
- javaScript学习与实践 (1)
- linux学习与实践 (4)
- Python学习与实践 (7)
- Oracle学习与实践 (21)
- Mysql学习与实践 (4)
- HTML5+CSS3学习与实践 (0)
- DIV+CSS学习与实践 (0)
- tomcat学习与实践 (1)
- mongodb学习与实践 (1)
- Git学习与实践 (2)
- hadhoop学习与实践 (0)
- shiro学习与实践 (0)
- CMS学习与实践 (0)
- Jmeter学习与实践 (0)
- java测试学习与实践 (2)
- bootstrap学习与实践 (0)
- jquery学习与实践 (0)
- Spring+hibernate+Struts2框架开发CRM项目 (0)
- JVM学习与实践 (0)
- 推荐学习网站 (1)
- 日常工作必备小技能 (4)
- Apache实践 (1)
- dubbo学习与实践 (2)
- Centos7 (6)
- 面试题目集合(收集各大网站) (4)
- 大数据学习 (1)
- 财富本 (2)
- 股票投资学习 (0)
- ZooKeeper (0)
- python切割集合里面相同的元素到一个集合里面 (1)
- 机器学习与深度学习 (1)
最新评论
-
魏叔武:
...
基于UDP协议的Socket编程
一、一些常见的SQL实践
(1)负向条件查询不能使用索引
select * from order where status!=0 and stauts!=1
not in/not exists都不是好习惯
可以优化为in查询:
select * from order where status in(2,3)
(2)前导模糊查询不能使用索引
select * from order where desc like '%XX'
而非前导模糊查询则可以:
select * from order where desc like 'XX%'
(3)数据区分度不大的字段不宜使用索引
select * from user where sex=1
原因:性别只有男,女,每次过滤掉的数据很少,不宜使用索引。
经验上,能过滤80%数据时就可以使用索引。对于订单状态,如果状态值很少,不宜使用索引,如果状态值很多,能够过滤大量数据,则应该建立索引。
(4)在属性上进行计算不能命中索引
select * from order where YEAR(date) < = '2017'
即使date上建立了索引,也会全表扫描,可优化为值计算:
select * from order where date < = CURDATE()
或者:
select * from order where date < = '2017-01-01'
二、并非周知的SQL实践
(5)如果业务大部分是单条查询,使用Hash索引性能更好,例如用户中心
select * from user where uid=?
select * from user where login_name=?
原因:
B-Tree索引的时间复杂度是O(log(n))
Hash索引的时间复杂度是O(1)
(6)允许为null的列,查询有潜在大坑
单列索引不存null值,复合索引不存全为null的值,如果列允许为null,可能会得到“不符合预期”的结果集
select * from user where name != 'shenjian'
如果name允许为null,索引不存储null值,结果集中不会包含这些记录。
所以,请使用not null约束以及默认值。
(7)复合索引最左前缀,并不是值SQL语句的where顺序要和复合索引一致
用户中心建立了(login_name, passwd)的复合索引
select * from user where login_name=? and passwd=?
select * from user where passwd=? and login_name=?
都能够命中索引
select * from user where login_name=?
也能命中索引,满足复合索引最左前缀
select * from user where passwd=?
不能命中索引,不满足复合索引最左前缀
(8)使用ENUM而不是字符串
ENUM保存的是TINYINT,别在枚举中搞一些“中国”“北京”“技术部”这样的字符串,字符串空间又大,效率又低。
三、小众但有用的SQL实践
(9)如果明确知道只有一条结果返回,limit 1能够提高效率
select * from user where login_name=?
可以优化为:
select * from user where login_name=? limit 1
原因:
你知道只有一条结果,但数据库并不知道,明确告诉它,让它主动停止游标移动
(10)把计算放到业务层而不是数据库层,除了节省数据的CPU,还有意想不到的查询缓存优化效果
select * from order where date < = CURDATE()
这不是一个好的SQL实践,应该优化为:
$curDate = date('Y-m-d');
$res = mysql_query(
'select * from order where date < = $curDate');
原因:
释放了数据库的CPU
多次调用,传入的SQL相同,才可以利用查询缓存
(11)强制类型转换会全表扫描
select * from user where phone=13800001234
你以为会命中phone索引么?大错特错了,这个语句究竟要怎么改?
末了,再加一条,不要使用select *(潜台词,文章的SQL都不合格 =_=),只返回需要的列,能够大大的节省数据传输量,与数据库的内存使用量哟。
(1)负向条件查询不能使用索引
select * from order where status!=0 and stauts!=1
not in/not exists都不是好习惯
可以优化为in查询:
select * from order where status in(2,3)
(2)前导模糊查询不能使用索引
select * from order where desc like '%XX'
而非前导模糊查询则可以:
select * from order where desc like 'XX%'
(3)数据区分度不大的字段不宜使用索引
select * from user where sex=1
原因:性别只有男,女,每次过滤掉的数据很少,不宜使用索引。
经验上,能过滤80%数据时就可以使用索引。对于订单状态,如果状态值很少,不宜使用索引,如果状态值很多,能够过滤大量数据,则应该建立索引。
(4)在属性上进行计算不能命中索引
select * from order where YEAR(date) < = '2017'
即使date上建立了索引,也会全表扫描,可优化为值计算:
select * from order where date < = CURDATE()
或者:
select * from order where date < = '2017-01-01'
二、并非周知的SQL实践
(5)如果业务大部分是单条查询,使用Hash索引性能更好,例如用户中心
select * from user where uid=?
select * from user where login_name=?
原因:
B-Tree索引的时间复杂度是O(log(n))
Hash索引的时间复杂度是O(1)
(6)允许为null的列,查询有潜在大坑
单列索引不存null值,复合索引不存全为null的值,如果列允许为null,可能会得到“不符合预期”的结果集
select * from user where name != 'shenjian'
如果name允许为null,索引不存储null值,结果集中不会包含这些记录。
所以,请使用not null约束以及默认值。
(7)复合索引最左前缀,并不是值SQL语句的where顺序要和复合索引一致
用户中心建立了(login_name, passwd)的复合索引
select * from user where login_name=? and passwd=?
select * from user where passwd=? and login_name=?
都能够命中索引
select * from user where login_name=?
也能命中索引,满足复合索引最左前缀
select * from user where passwd=?
不能命中索引,不满足复合索引最左前缀
(8)使用ENUM而不是字符串
ENUM保存的是TINYINT,别在枚举中搞一些“中国”“北京”“技术部”这样的字符串,字符串空间又大,效率又低。
三、小众但有用的SQL实践
(9)如果明确知道只有一条结果返回,limit 1能够提高效率
select * from user where login_name=?
可以优化为:
select * from user where login_name=? limit 1
原因:
你知道只有一条结果,但数据库并不知道,明确告诉它,让它主动停止游标移动
(10)把计算放到业务层而不是数据库层,除了节省数据的CPU,还有意想不到的查询缓存优化效果
select * from order where date < = CURDATE()
这不是一个好的SQL实践,应该优化为:
$curDate = date('Y-m-d');
$res = mysql_query(
'select * from order where date < = $curDate');
原因:
释放了数据库的CPU
多次调用,传入的SQL相同,才可以利用查询缓存
(11)强制类型转换会全表扫描
select * from user where phone=13800001234
你以为会命中phone索引么?大错特错了,这个语句究竟要怎么改?
末了,再加一条,不要使用select *(潜台词,文章的SQL都不合格 =_=),只返回需要的列,能够大大的节省数据传输量,与数据库的内存使用量哟。
发表评论
-
java环境配置为1.6 jdk为什么cmd java -version查看版本是1.8
2019-08-05 16:24 700问题描述:由于开发环境需要多个jdk版本,故切换的时候,直接修 ... -
java写的日期工具,根据设置日期获取指定的一周或者一个月的所有日期
2017-08-25 19:48 900在做项目中遇到一个关于日记的问题,国外算一周是从周末到周六,而 ... -
Springmvc操作Redis和Redis集群(java语言)
2017-07-21 21:34 0http://www.toutiao.com/a6341122 ... -
接口测试用例设计指导文档:新建、查询、修改、删除、功能以及流程等用例设计
2017-07-24 15:48 1820一、功能点测试用例(单个测试用例) 二、新建接 ... -
一个合格程序员应该会的技能点--自勉
2017-05-02 10:54 466操作系统:centos+windows7 工具类使用: ec ... -
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'a
2017-04-09 15:05 1763org.springframework.beans.facto ... -
eclipse中快速关闭所有打开的html,jap,java文件等
2017-03-01 08:58 756如下图所示,为了演示,只打开了三四个文件,如果更加多呢? 第 ... -
eclipse常用的一些快捷方式
2017-03-01 08:45 393[b]Eclipse中有如下一些和编辑相关的快捷键。 ... -
An internal error occurred during: "Launching java.lang.NullPointerException
2017-02-23 08:19 664如果出现了上述的错误按照如下的3个步骤解决: 1、首先关闭 ... -
Eclipse Class Decompiler——Java反编译插件
2017-02-17 09:11 0Eclipse Class Decompiler,整合了目前最 ... -
格式化日期,添加中文显示
2017-01-18 11:39 377... -
Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If
2017-01-10 22:15 493解决办法: 找到自己的eclipse工作空间的 serv ... -
java.lang.ClassCastException:[Ljava.lang.Object;cannot be cast to java.util.List
2017-01-05 09:37 1455使用 SQLQuery query = this.getSes ... -
java.sql.SQLException: sql injection violation, syntax error: syntax error, erro
2017-01-02 11:05 2507在用alibaba的druid连接池的时候,报错误: jav ... -
EXCEL统计一个列中重复的数据的快捷方法
2016-12-21 13:49 454excel里面有个函数: =IF(COUNTIF($A$2: ... -
eclipse打开就自动关闭了。解决办法
2016-12-20 08:53 491到eclipse的工作空间 删除文件workspace目录下 ... -
errorcould not open ...jvm.cfg解决方法
2016-12-19 16:53 854出现这种情况大多是因为电脑上之前安装过JDK,卸载重装之后,运 ... -
eclipse中修改项目的名称
2016-12-19 16:44 384一、右键工程:Refactor->Rename,或选中工 ... -
windows7重转系统,cannot display this video mode,如何处理?
2016-11-25 15:34 994原因是:分辨率设得太高了,可以从安全模式恢复,如下: 一:在 ... -
浏览器F12查看action变化
2016-10-26 16:21 425今天工作的时候,用chrome浏览器,f12的时候,查看act ...
相关推荐
SQL技巧全集是数据库管理员、数据分析师和开发人员的宝贵资源,涵盖了多种实用的查询、操作和优化技术。以下是一些核心的SQL知识点,根据标题和描述进行详细阐述: 1. **SQL操作大全**:SQL操作包括了数据的增...
### SQL技巧:常用SQL操作语句详解 #### 1. 复制表(仅复制结构) **场景描述:** 在数据库管理过程中,有时我们需要创建一个与现有表具有相同结构但不包含任何数据的新表。例如,当我们需要为测试或备份目的创建...
在掌握了基础后,可以深入学习更复杂的SQL技巧,如子查询、联接操作的优化、窗口函数(ROW_NUMBER、RANK、DENSE_RANK等)以及存储过程和触发器的使用。理解这些高级概念将有助于解决复杂的数据问题和提升数据库性能...
以下是一些实用的T-SQL技巧: 1. **只复制一个表结构,不复制数据** 这个技巧在你只需要创建一个新的表结构,而不需要初始数据时非常有用。例如,你可能想创建一个测试表或备份表。通过以下语句,你可以快速地从...
以下是一些关于Oracle常用SQL技巧的经典要点: 1. **避免在SELECT子句中使用“*”**:在SQL查询中,使用通配符“*”代表选择所有列,虽然方便但效率低下。Oracle在解析时需要查询数据字典获取所有列名,增加了额外...
了解并掌握这些SQL技巧性数据库编程的知识点,不仅可以提高数据库操作的效率,还能确保数据的一致性和准确性。无论是日常的数据管理,还是复杂的业务逻辑实现,这些技巧都是SQL Server开发者的必备工具。
标题"INFORMIX SQL技巧.rar_informix"暗示了这份压缩包包含的是关于Informix数据库管理系统中SQL(结构化查询语言)的使用技巧和优化方法。Informix是一个强大的关系型数据库系统,广泛应用于企业级的数据存储和处理...
MS-SQL开发常用汇总和t-sql技巧集锦MS-SQL开发常用汇总和t-sql技巧集锦
Informix SQL 技巧是针对数据库管理与优化的重要领域,尤其对于初学者来说,掌握这些技巧能够显著提升查询效率和数据库性能。以下是一些关键的Informix SQL优化策略: 1. **使用临时表优化排序和连接**: 当你需要...
sql技巧.pdf 非常实用的书,数据库开发必备经典
在SQL的世界里,T-SQL(Transact-SQL)是SQL Server所使用的扩展SQL语言,它包含了许多实用的技巧和方法来提升数据库管理和数据操作的效率。以下是一些关于T-SQL的技巧: 1. **复制表结构而不复制数据**: 当你...
在MS-SQL开发中,掌握一些常用的技巧和命令可以极大地提高效率和代码质量。以下是一些关键知识点的详细说明: 1. **日期转换**:在SQL Server中,使用`CONVERT`函数可以将日期格式化。例如,`CONVERT(char(10),...
SQL操作技巧大全 在本篇文章中,我们将探讨常用SQL操作技巧,涵盖复制表、拷贝表、显示文章、外连接查询、日程安排提前五分钟提醒、两张关联表删除、统计分析等多种SQL操作技巧。 一、复制表 复制表是一种常见的...
这里我们将深入探讨一些在MS SQL Server中常用的SQL技巧,这些技巧可以帮助数据库管理员和开发人员更加高效地工作。 1. **连接服务器**: 在MS SQL Server中,可以通过`sp_oamethod`和`sp_oasetproperty`这两个...
SQL开发技巧是数据库管理与应用中的重要组成部分,尤其在企业内部培训中,掌握这些技巧能够显著提高数据库操作的效率和性能。以下是一些常见的SQL开发规范和优化技巧: 1. **利用WHERE子句限制查询结果集**:通过...
下面我们将详细探讨一些关键的SQL技巧。 1. **子查询与联接操作**: - 子查询是SQL中的重要组成部分,它可以嵌套在其他查询中,用于获取满足特定条件的数据。例如,你可以用子查询来找到销售额最高的产品ID,然后...
SQL常用技术,包含日常数据库维护,查Lock, Kill Lock, 分布式查询及使得SQL导入EXCEL数据等
内容概要:本文详细解析了SQL查询的各种技术和应用场景,涵盖了常见的数据库查询优化技术,包括如何使用 * 进行查询、按条件筛选、使用别名、实现列连接、条件逻辑处理、分组统计、排序、笛卡儿积处理以及各种复杂的...