了解优化之前先了解一下搜索原理B树、B-树、B+树、B*树之间的关系!分享2篇博客!

https://blog.csdn.net/u013411246/article/details/81088914
https://tonydong.blog.csdn.net/article/details/104020721

以下优化SQL法则适用于各种关系型数据库,包括但不限于:MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite 等.

一、避免使用select * from 表;这样会检索出所有得数据,网络传输数据太多也会降低性能。
二、确保查询使用正确的索引。
缺少合适的索引在查询时候也不会通过索引查找数据。因此记录一些经常用到需要建立索引的地方!
1、where后面的赛选条件可以添加索引,可避免全表扫描。
2、order by 排序的字段加入到索引中,避免排序操作,索引自带排序规则。
3、多链接查询关联字段建立索引,可提高链接查询功能。
4、group by分组操作的字段建立索引,可利用索引完成分组。

即使为关键字段建立了索引,单sql写的有问题,也会导致索引失效!个人知道以下几点。
1、where子句中,对索引字段进行表达式运算或者调用函数,会导致索引失效,这种情况,还包括数据类型的不匹配,例如字符串和整数比较大小。
2、在like模糊查询时候,通配符在左侧也会导致索引失效,一般大型的文本数据模糊匹配考虑使用弹性搜索引擎(全文搜索引擎)(elasticSearch)
3、在where后加索引的字段,尽量设置为not null,虽然不是对所有的数据库都有效果。

执行计划

执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等。如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划,通过执行计划(EXPLAIN)确保查询使用了正确的索引。
关于各种主流数据库中执行计划的查看和解释,可以参考这篇文章和这篇文章。

https://tonydong.blog.csdn.net/article/details/103579177
https://blog.csdn.net/horses/article/details/106905110

三、尽量减少使用子查询
以 MySQL 为例,以下查询返回月薪大于部门平均月薪的员工信息:

EXPLAIN ANALYZESELECT emp_id, emp_nameFROM employee eWHERE salary > (SELECT AVG(salary)FROM employeeWHERE dept_id = e.dept_id);
-> Filter: (e.salary > (select #2)) (cost=2.75 rows=25) (actual time=0.232..4.401 rows=6 loops=1)-> Table scan on e  (cost=2.75 rows=25) (actual time=0.099..0.190 rows=25 loops=1)-> Select #2 (subquery in condition; dependent)-> Aggregate: avg(employee.salary) (actual time=0.147..0.149 rows=1 loops=25)-> Index lookup on employee using idx_emp_dept (dept_id=e.dept_id) (cost=1.12 rows=5) (actual time=0.068..0.104 rows=7 loops=25)
 从执行计划可以看出,MySQL 中采用的是类似 Nested Loop Join 实现方式;子查询循环了 25 次,而实际上可以通过一次扫描计算并缓存每个部门的平均月薪。以下语句将该子查询替换为等价的 JOIN 语句,实现了子查询的展开(Subquery Unnest):
EXPLAIN ANALYZESELECT e.emp_id, e.emp_nameFROM employee eJOIN (SELECT dept_id, AVG(salary) AS dept_averageFROM employeeGROUP BY dept_id) tON e.dept_id = t.dept_idWHERE e.salary > t.dept_average;
-> Nested loop inner join (actual time=0.722..2.354 rows=6 loops=1)-> Table scan on e (cost=2.75 rows=25) (actual time=0.096..0.205 rows=25 loops=1)-> Filter: (e.salary > t.dept_average)  (actual time=0.068..0.076 rows=0 loops=25)-> Index lookup on t using <auto_key0> (dept_id=e.dept_id) (actual time=0.011..0.015 rows=1 loops=25)-> Materialize (actual time=0.048..0.057 rows=1 loops=25)-> Group aggregate: avg(employee.salary) (actual time=0.228..0.510 rows=5 loops=1)-> Index scan on employee using idx_emp_dept (cost=2.75 rows=25) (actual time=0.181..0.348 rows=25 loops=1)

改写之后的查询利用了物化(Materialization)技术,将子查询的结果生成一个内存临时表;然后与 employee 表进行连接。通过实际执行时间可以看出这种方式更快。
以上示例在 Oracle 和 SQL Server 中会自动执行子查询展开,两种写法效果相同;在 PostgreSQL 中与 MySQL 类似,第一个语句使用 Nested Loop Join,改写为 JOIN 之后使用 Hash Join 实现,性能更好

另外,对于 IN 和 EXISTS 子查询也可以得出类似的结论。由于不同数据库的优化器能力有所差异,我们应该尽量避免使用子查询,考虑使用 JOIN 进行重写。

四、不乱用offset进行分页的实现,
分页查询的原理就是先跳过指定的行数,再返回 Top-N 记录。

数据库一般支持 FETCH/LIMIT 以及 OFFSET 实现 Top-N 排行榜和分页查询。当表中的数据量很大时,这种方式的分页查询可能会导致性能问题。以 MySQL 为例:

-- MySQL
SELECT *FROM large_tableORDER BY idLIMIT 10 OFFSET N;

以上查询随着 OFFSET 的增加,速度会越来越慢;因为即使我们只需要返回 10 条记录,数据库仍然需要访问并且过滤掉 N(比如 1000000)行记录,即使通过索引也会涉及不必要的扫描操作。

Sql优化v-1.0相关推荐

  1. Spark Sql优化之3.0特性AQE

    前言 这一篇来介绍Spark3.0版本中Spark Sql新增的重要特性AQE AQE全称Adaptive Query Execution,在3.0版本中主要包含以下三个功能 (1)Dynamical ...

  2. 知数堂郑松华:MySQL 8.0 SQL优化之CTE 、窗口函数的应用

    特邀嘉宾 郑 松 华 知数堂<SQL优化>课程讲师 资深数据库工程师 对SQL优化有独到见解 7年SQL开发和调优经验 于韩国法院数据中心从事数据库技术支持 原SKC&CSheny ...

  3. 今晚直播,你该了解的MySQL 8.0 SQL优化新特性

    周四见   公开课系列 We,知数堂 习惯用实力介绍自己-我们只分享干货 重磅福利来袭 2018年8月9日,20:30-22:00 周四见 不见不散! 郑 松 华 知数堂<SQL优化>课程 ...

  4. 和Oracle差距越来越小,你该了解的MySQL 8.0 SQL优化新特性

    周四见   公开课系列 We,知数堂 习惯用实力介绍自己-我们只分享干货 重磅福利来袭 2018年8月9日,20:30-22:00 周四见 不见不散! 郑 松 华 知数堂<SQL优化>课程 ...

  5. 唐诗宋词 v3.0 软件下载 唐诗宋词三百首 唐诗三百首 宋词三百首 唐诗三百首下载 宋词三百首下载 SQL优化前后的代码:...

    v3.0 加快了诗词数据加载速度,诗词总页数达4500页    下载地址 v3.1.5 下载地址 v3.2 完善了所有功能 下载地址 华军下载: http://www.newhua.com/soft/ ...

  6. 1000w的数据表,18s执行的SQL优化到0.22s?

    一.废话不多说直接上 先看一下我的MySQL版本 SELECT VERSION(); 表结构 desc test; id为自增主键,val为常规索引. 增加1000w数据,测试运行sql文件较快50w ...

  7. SQL优化|Java面试题

    看到一篇非常全面的SQL优化文章,在开发的工作中往往不考虑性能上的缺失(在一开始的时候数据量不大也看不出速度上的区别).但写的越多越应该规范一下写法. 原文链接:http://www.jfox.inf ...

  8. 关于数据库SQL优化

    1.数据库访问优化 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件时硬 ...

  9. mysql高效sql语句_高效SQL优化 非常好用的SQL语句优化34条

    高效SQL优化 非常好用的SQL语句优化34条 相关软件相关文章发表评论 来源:2011/2/13 9:38:43字体大小: 作者:佚名点击:576次评论:0次标签: 类型:电子教程大小:8.5M语言 ...

  10. oracle sql优化

    (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表driving table)将被最先处 ...

最新文章

  1. LeetCode简单题之三维形体的表面积
  2. 三十六亿的《哪吒》历时五年,如何用AI解决动画创作难题?
  3. 重磅丨AI公共政策成全球热点,美国ITI发布《人工智能政策原则》
  4. 自定义View(二),强大的Canvas
  5. rhel iptables只允许限定IP访问某端口、某特定网站
  6. 【laravel】laravel的基础学习笔记
  7. gitlab更新配置无效_GitMaster 发布 v1.11.0 版本,支持 GitLab 多级分组,Gist支持文件列表...
  8. 掌握这 11 个方法论,搞定一场完美技术面试!
  9. linux下c语言 双向链表
  10. linux msleep 头文件,Linux延迟函数
  11. linux清除硬盘,linux下清除硬盘的几种方法
  12. ASP.NET中利用JQuery AJAX修改用户密码
  13. tomcat 设置xms xmx,采用startup.bat启动和采用操作系统服务启动区别
  14. 数据库, 数据仓库, 数据集市,数据湖,数据中台
  15. python培训学费多少钱-福州Python培训大概多少钱?
  16. 机器人断指_揭秘我国机器人发展历程:从机械手到服务机器人
  17. 用Far制作chm的简易教程
  18. 【洛谷】P1428:小鱼比可爱
  19. GB28181公网语音对讲
  20. 洛谷P5545 炸弹攻击2

热门文章

  1. 【Python黑科技】图片太大不能上传?三种压缩图片大小的方法(代码注释详细)
  2. XU316-1024-熙光技术
  3. OpenAVNU 带宽预留协议SRP代码分析
  4. kali2021.1安装pdtools挤牙膏式爬坑日记
  5. PD快充DRP-TypeC连接状态机详解
  6. Frps搭建内网穿透(服务器及客户端详细)
  7. Multisim10中仿真时间步长与数码显示管的类型有关
  8. 等额本息人人都会计算!
  9. jca 实例 java_jca工具分析was的javacore实例解析
  10. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java科研信息管理503pp