sql优化的8种方式 (下)
五、条件列表值如果连续使用between替代in
六、无重复记录的结果集使用union all合并
MySQL数据库中使用union或union all运算符将一个或多个列数相同的查询结果集上下合并成为一个查询结果集。其中union会合并各个结果集中相同的记录行,重复记录只显示一次外加自动排序,而union all运算符不去重不排序。因此,对于无重复记录的多个查询结果集应当使用union all合并。参见如下实验:
方法一:select * from t where id=1 union select * from t where id=2;
方法二:select * from t where id=1 union all select * from t where id=2;
使用union运算符由于需要去除重复记录和排序,查询时间为1.229秒高于union all运算符的1.120秒。因此,对于无重复记录的结果集使用union all合并的效率要高。
七、有条件使用where就不使用having
在SELECT查询语句中,where子句和having子句都起到对行记录过滤的作用,主要区别在于having子句是对group by子句产生的结果(可能包含聚合函数),而where子句先于having子句运行,主要目的是缩减查询结果集的行记录数。
方式一:select CountryCode,count() from city where CountryCode=‘CHN’;
方式二:select CountryCode,count() from city group by CountryCode having CountryCode=‘CHN’
使用where子句的方式一的SQL书写方式仅仅耗时1.463秒,远低于耗时6.897秒的使用having子句的SQL书写方式二。其主要原因是方式二的SQL写法是在分组统计了所有国家城市的数量,然后再使用having子句将统计结果过滤出仅仅是中国的城市数量,SQL解析器耗费了大量资源统计了与需求无关的数据,致使查询效率下降。因此,当需求明确时,应尽量使用where子句缩小查询结果集,然后再使用相关聚合函数进行统计分析。
八、使用like操作符时通配符要放在右侧
在书写SQL语句时,如果在where或having子句中使用like模糊匹配操作符,通配符“%”或“_”不要写在匹配字符串的左侧,参见以下两种书写方式:
方式一:select * from t where name like ‘150’;
方式二:select * from t where name like ‘a150_’;
使用like操作符的查询条件列带有索引时,如果通配符放在最左边,索引会失效,SQL优化器会选择效率低的全表扫解析方式,主要原因是对字符串类型创建索引时,MySQL将从最左开始选取一部分(767字符,最多到3072字符)字符串,将其内容存入到索引中。如果查询条件最左侧是可以匹配任意字符的通配符,无法定位具体的索引键值,优化器就会选择其他获取数据的方式而忽略索引的存在。因此,当带有索引的查询条件列是字符类型,如果使用模糊匹配操作符,不要将其放在最左侧,要放到第一个具体字符的右侧
九、补充:
数据库怎么优化查询效率?
储存引擎选择:如果数据表需要事务处理,应该考虑使用 InnoDB,因为它完全符合 ACID 特性。
如果不需要事务处理,使用默认存储引擎 MyISAM 是比较明智的
分表分库,主从。
对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索
引
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全
表扫描
应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫
描
应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,
将导致引擎放弃使用索引而进行全表扫描
Update 语句,如果只更改 1、2 个字段,不要 Update 全部字段,否则频繁调用会引起明显的
性能消耗,同时带来大量日志
对于多张大数据量(这里几百条就算大了)的表 JOIN,要先分页再 JOIN,否则逻辑读会很高,
性能很差。
sql优化的8种方式 (下)的更多相关文章
- sql优化的8种方式
1.设置索引. MySQL索引操作:给表列创建索引: 建表时创建索引: create table t(id int,name varchar(20),index idx_name (name)); 给 ...
- sql优化的几种方式
一.为什么要对SQL进行优化 我们开发项目上线初期,由于业务数据量相对较少,一些SQL的执行效率对程序运行效率的影响不太明显,而开发和运维人员也无法判断SQL对程序的运行效率有多大,故很少针对SQL进 ...
- CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking)
CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking) 我在(Modern OpenGL用Shader拾取 ...
- 预处理(防止sql注入的一种方式)
<!--- 预处理(预编译) ---><?php/* 防止 sql 注入的两种方式: 1. 人为提高代码的逻辑性,使其变得更严谨,滴水不漏. 比如说 增加判断条件,增加输入过滤等,但 ...
- sql优化 表连接join方式
sql优化核心 是数据库中 解析器+优化器的工作,我觉得主要有以下几个大方面:1>扫表的方法(索引非索引.主键非主键.书签查.索引下推)2>关联表的方法(三种),关键是内存如何利用 ...
- 启动bash shell的三种方式下,检查的启动文件
启动bash shell的三种方式 1.登录时当做默认登录shell 2.作为非登录shell的交互式shell 3.作为运行脚本的非交互shell 一.登录shell 登录Linux系统时,bash ...
- Mybatis控制台打印SQL语句的两种方式
问题描述在使用mybatis进行开发的时候,由于可以动态拼接sql,这样大大方便了我们.但是也有一定的问题,当我们动态sql拼接的块很多的时候,我们要想从*mapper.xml中直接找出完整的sql就 ...
- sql优化的几种方法
在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 ord ...
- MySQL数据库优化的八种方式(经典必看)
引言: 关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂 偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿到自己的总结文集中,积累优质文章,提升个人 ...
随机推荐
- asp.net中挺高性能的24种方法
那性能问题到底该如何解决?以下是应用系统发布前,作为 .NET 开发人员需要检查的点. 1.debug=「false」 当创建 ASP.NET Web应用程序,默认设置为「true」.开发过程中,设置 ...
- 【JAVA】笔记(7)--- 数组精讲
数组的静态初始化: 1.一维数组: int [ ] arr = { 1,2,3,4 } ; Object [ ] arr = { new Object ( ) , new Object ( ) , ...
- blazor wasm开发chrome插件
用blazor(Wasm)开发了一个chrome插件感觉效率挺高的,分享给大家 先简单介绍下WebAssembly的原理: "WebAssembly是一种用于基于堆栈的虚拟机的二进制指令格式 ...
- Linux——搭建FTP服务
一.FTP基本概念: 1.FTP的作用: 实现文件系统的安全匿名访问:包括上传.下载和查看,可以应用于Windows和Linux系统 2.FTP的工作原理 server与client都支持ftp传输协 ...
- 菜鸡的Java笔记 - java 双向一对多映射
双向一对多映射 two-way 开发要求: 根据数据表的结构进行简单java类的转换: 要求实现如下的输出信息: 可以根据课程取得全部参与 ...
- opa gatekeeper笔记:AdmissionReview input.request请求对象结构
官方:https://v1-17.docs.kubernetes.io/zh/docs/reference/access-authn-authz/extensible-admission-contro ...
- 【BugFix】K8S节点NOT READY状态,错误信息:network plugin is not ready: cni config uninitialized
错误现象 runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: netw ...
- [cf1495D]BFS Trees
记$d_{G}(x,y)$表示无向图$G$中从$x$到$y$的最短路,设给定的图为$G=(V,E)$,$T$为其生成树,$E_{T}$为$T$的边集 下面,考虑计算$f(x,y)$-- 首先,对于一棵 ...
- [atAGC052B]Tree Edges XOR
定义两点的距离$d(x,y)$为$x$到$y$路径上边权异或和,则两棵树相同当且仅当$\forall 1\le i\le n$,$d(1,i)$相同 新建一个节点0,连边$(0,1)$,初始权值为0, ...
- [bzoj1190]梦幻岛宝珠
根据$2^b$分组,组内处理出g[i][j]表示当容量为$j\cdot 2^{i}$且只能选b=i时最大价值,再组间dp用f[i][j]表示当容量为$j\cdot 2^{i}+(w\&(2^{ ...