干货总结-全面解析SQL优化

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 干货总结-全面解析SQL优化

这是我的第11篇原创


有朋友说让讲讲SQL的调优,其实这类文章全网都是。想说点自己的理解,又怕写的又臭又长。所以先把提纲列前面,没有帮助的同学可以直接关掉了。

SQL优化,总共可以分为三层:数据库系统、数据库设计、程序设计。我按照先易后难的顺序,又分为表设计优化、查询优化、索引优化、架构优化、业务优化5方面:


目录


通常来说SQL优化指的都是查询优化,但是最坑的是我们的对手 遇不安套路出牌,很多挑战通常不能用SQL技巧解决。


①影响性能的原因


影响SQL性能的原因有很多,最令人头疼的是需求侧。业务方不关心你的sql怎么写,他们只要结果,甚至有些时候技术端也会出一些奇葩的要求。

架构侧导致的问题也挺多的,典型的问题是分页、过度退化(业务 宽表)等。

其实数据侧的问题是比较容易达成共识,并解决的。

所有的SQL性能低的原因中,SQL本身的原因是最容易解决的。


②表设计优化

  • 编码规则设计:

开发设计的树形结构设计一般只增加一个父ID,其实我们还可以增加业务code和层级标识。业务code一般会有编码规则,以中国行政地区代码为例,每2位代表一层,随便拿一个code,通过字段截取,就能直接查到任意父节点对应的内容。


数仓建设的时候,抽离三级地区维度也非常容易,限定layer层即可。

  • 扩展信息表

将核心信息放在主表中,将写频繁、新增的字段放在扩展信息表中,进行部分业务的解耦。设计是一个平衡的过程,跨表则多一次关联,都放一起则造成臃肿。

  • 字段选择

tips:大文本、图片建议存文件,数据库中存路径即可。


③查询优化

基本思路:

1、有大炮,就别用手枪。查询要走索引

2、溺水三千只取一瓢,不要select *

3、数据库是用来存的,不是用来算的,查就查,不要算


工具(以MySQL为例):

1、用Explain查看 SQL 执行计划:

可以发现主要拖慢效率的内容,比如某个表数据量大,资源消耗多。

2、通过 Profile 查阅每一步的资源消耗:

可以发现每一步的资源消耗,涉及多少数据,消耗多少时间等。

3、通过 Optimizer Trace 表查看 SQL 优化器生成执行计划的过程,逐步优化时好用。


基本上用explain和profile就能掌握sql执行的所有消耗,然后根据以下原则,进行优化,顺便开启Optimizer Trace看看自己优化的是否对路:


1、禁止使用“%”前导的查询

2、所有表都加别名,需要加在所有字段前面match

3、用union代替or

4、null 值判断、!=或<>操作符会导致全表扫描

5、用between、exists代替in,用not exists 代替not in

6、禁止使用select *

7、小结果集join大结果集

8、使用limit

9、减少where中对字段的计算操作


④索引优化

上面的SQL优化技巧中,禁止的原因基本是使索引失效。索引太重要了,因此单列一章详细讲讲。


索引的设计:

1、单张表中索引数量不超过5个;

2、单个索引字段数不超过5个;

3、频繁修改的字段上不建议建索引;

4、区分度越大,索引效果越好;性别字段建索引,等于没建;

5、索引字段尽量短,尽量选择数字字段

6、在查询、排序、分组、where判定频繁的字段上建索引

7、经常删数据的表,定期清理

8、用join代替子查询


索引的使用:

禁止在索引列进行数学运算;

使用联合索引时,按顺序查询(索引的最左原则);

尽量在索引同时满足查询和排序;

字符串索引使用前缀索引,前缀长度不超过10个字符;

索引join时,使用的字段类型要一样;


⑤架构优化

架构层面轻易不动,一动就是大工程,其核心是分开:

1、主从+读写分离

2、分库分表


数据库事务主要就是读和写,这俩分开之后读操作可以占有服务器的所有资源,自然就快了。

分库是垂直切分,按照业务领域,将关系比较紧密的表分到同一个库中,原本一个数据库垂直切分为N个业务库,每个库的压力就小了,效率就高了。

分表是水平切分,对某个表按规则横向切分成N个小表,单表数据量就变小了,查询效率也就变高了。

点我查看“单表超大数据量处理-水平切割法”文章


⑥业务优化

如同开篇所提,我们遇到的难解的问题,来自于需求侧的比较多,也更为棘手,甚至是无法解决。在这里提几个常用技巧:


1、需求转换

摸清对方真实需求,有些时候只是想为他的论点找论据而已。

2、替代方案

一个新指标的数据逻辑太复杂,可以考虑用其他已有指标代替,能表达他的意思即可。

3、降低期望

他说饿了,不一定要给一碗鲍鱼炒饭,一个馒头也是可以的。

相关文章
|
9天前
|
SQL 数据库
SQL解析相关报错
SQL解析相关报错
29 5
|
13天前
|
文字识别 算法 API
阿里云文档解析(大模型版)优化
阿里云文档解析(大模型版
|
14天前
|
SQL 安全 数据库
Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
28 1
|
1月前
|
XML 存储 数据格式
RAG效果优化:高质量文档解析详解
本文关于如何将非结构化数据(如PDF和Word文档)转换为结构化数据,以便于RAG(Retrieval-Augmented Generation)系统使用。
|
1月前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
166 1
|
22天前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
44 0
|
2月前
|
开发者 图形学 iOS开发
掌握Unity的跨平台部署与发布秘籍,让你的游戏作品在多个平台上大放异彩——从基础设置到高级优化,深入解析一站式游戏开发解决方案的每一个细节,带你领略高效发布流程的魅力所在
【8月更文挑战第31天】跨平台游戏开发是当今游戏产业的热点,尤其在移动设备普及的背景下更为重要。作为领先的游戏开发引擎,Unity以其卓越的跨平台支持能力脱颖而出,能够将游戏轻松部署至iOS、Android、PC、Mac、Web及游戏主机等多个平台。本文通过杂文形式探讨Unity在各平台的部署与发布策略,并提供具体实例,涵盖项目设置、性能优化、打包流程及发布前准备等关键环节,助力开发者充分利用Unity的强大功能,实现多平台游戏开发。
55 0
|
2月前
|
开发者 图形学 UED
深度解析Unity游戏开发中的性能瓶颈与优化方案:从资源管理到代码执行,全方位提升你的游戏流畅度,让玩家体验飞跃性的顺滑——不止是技巧,更是艺术的追求
【8月更文挑战第31天】《Unity性能优化实战:让你的游戏流畅如飞》详细介绍了Unity游戏性能优化的关键技巧,涵盖资源管理、代码优化、场景管理和内存管理等方面。通过具体示例,如纹理打包、异步加载、协程使用及LOD技术,帮助开发者打造高效流畅的游戏体验。文中提供了实用代码片段,助力减少内存消耗、提升渲染效率,确保游戏运行丝滑顺畅。性能优化是一个持续过程,需不断测试调整以达最佳效果。
62 0
|
2月前
|
SQL 数据处理 数据库
|
2月前
|
SQL 监控 供应链

推荐镜像

更多
下一篇
无影云桌面