聊一聊SQL优化
晚上睡不着,脑子里总想着一些问题,试着写一写对于SQL查询优化的见解。
首先,数据库有自己的查询优化器,执行一条查询SQL优化器会选择最优的方式(不走索引、走索引、走哪个索引),
所以索引不是越多越好,因为创建索引需要成本,提高索引命中率是优化SQL的关键。
索引分为主键索引和普通索引,在Mysql数据库的InnoDB下,索引的结构是一颗B+树(非叶子节点存放索引,叶子节点存放数据、所有叶子节点组成一个双向链表),
每一张表都有一个主键索引,意味着有一个主键索引的B+树,创建一个普通索引同时会创建一个该索引的B+树,和主键索引的不同点是,普通索引的叶子节点存放的是(索引列+主键ID),
如果查询优化器命中主键索引,直接通过主键索引查询出数据
如果查询优化器命中该索引,查询数据列被索引覆盖了则直接返回,如果没有覆盖,则需要通过主键ID去查询主键索引的数据,这个过程称为回表。
如果没有命中索引,会遍历主键索引的叶子节点(全表扫描)
主键索引 > 其他索引(索引未覆盖需要回表)> 全表扫描
使用执行计划查看SQL使用索引情况
如何排查慢查询?
1、线上日志
2、开启慢查询日志(影响性能)
3、查看SQL执行计划
如何选择合适的索引列?
适合作为索引的列:查询条件、排序条件
不适合做索引的列:没有作为查询条件、唯一性太差(走索引效率不高)、更新频繁(索引维护成本高)
组合索引的顺序选择:根据条件使用热度来排序
如何避免索引失效?
遵循最左前缀法则,比如一个组合索引(abc),要命中索引查询条件的组合有(a、ab、ac、abc)
避免在索引列上使用函数,这样会使索引失效
避免使用全模糊查询
数据类型不一致
对索引列进行运算
NOT NULL
IN子查询
。。。。?
减少网络IO、减少回表?
禁止使用 *
连表查询?
连表条件创建索引
小表驱动大表
业务优化?
举例,深分页可以把上一页最大ID作为Where条件,减少扫描范围
其他?
拉宽表,允许一些冗余字段,减少表连接
分库分表
聊一聊SQL优化的更多相关文章
- SQL优化案例—— RowNumber分页
将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...
- sql 优化
1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表driving table)将被最先处 ...
- SQL 优化总结
SQL 优化总结 (一)SQL Server 关键的内置表.视图 1. sysobjects SELECT name as '函数名称',xtype as XType FROM s ...
- (转)SQL 优化原则
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...
- sql优化阶段性总结以及反思
Sql优化思路阶段性心得: 这段时间的优化做了好几个案例,其实有很多的类似点,都是好几张大表的相互连接,然后执行长达好几个小时,甚至都跑不出来. 自己差不多的思路就是Parallel full tab ...
- mysql sql优化实例
mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...
- SQL优化技巧
我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ...
- ORACLE常用SQL优化hint语句
在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...
- SQL优化有偿服务
本人目前经营MySQL数据库的SQL优化服务,100块钱一条.具体操作模式 其中第一条,可以通过在微信朋友圈转发链接中的信息(http://www.yougemysqldba.com/discuz/v ...
- 【MySQL】SQL优化系列之 in与range 查询
首先我们来说下in()这种方式的查询 在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的. ...
随机推荐
- 十大java应用服务器(web server)总结
java应用服务器(web server),是指运行java程序的web应用服务器软件,不包括nginx.Apache等通用web服务器软件. 一.Tomcat Tomcat是Apache 软件基金会 ...
- socket 地址复用 SO_REUSEADDR
背景 默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口(例如888),这时候,别的套接字就无法使用这个端口( 888 ) ref : https://blog.csdn.net/tenn ...
- 全志科技T3国产工业评估板规格书(四核ARM Cortex-A7,主频1.2GHz)
1 评估板简介 创龙科技TLT3-EVM是一款基于全志科技T3处理器设计的4核ARM Cortex-A7高性能低功耗国产评估板,每核主频高达1.2GHz,由核心板和评估底板组成. 评估板接口资源丰富, ...
- 【VMware vSAN】vSAN Data Protection Part 1:安装部署。
VMware vSAN 8 U3 中新引入了基于 vSAN ESA 的全新 vSAN Data Protection 功能,借助 vSAN Data Protection 功能,您可以使用在 vSAN ...
- 一个用来画拉氏图的简单Python脚本
技术背景 关于拉氏图的更多介绍,可以参考下这篇博客,这里简单引述一部分内容: Ramachandran plot(拉氏图)是由G. N. Ramachandran等人于1963年开发的,用来描述蛋白质 ...
- ubuntu22 flask项目 pyinstaller打包后运行报错: jinja2.exceptions.TemplateNotFound: index.html 的一种解决方案
前言 有一个flask项目a.py, 目录结构如下: |- a.py |- templates | - index.html |- static |- images 运行 python3 a.py可以 ...
- python学习_PIL的Image模块初步使用
基本介绍: Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像.调整图像大小和图像颜色处理等.与 Pillow 相比,OpenCV 和 Scikit-imag ...
- Golang 切片作为函数参数传递的陷阱与解答
作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. GitHub : https://github.com/af913337456/ 出版的书籍: <1.0-区块链DApp开发实战&g ...
- el-date-picker的value-forma在Element UI (Vue 2)和Element Plus (Vue 3)中的不同
Element UI (Vue 2): <template> <el-form-item prop="register_date" label="成立日 ...
- oeasy 教您玩转 linux 010400 总结 summary
###### 上一部分我们都讲了什么?* 各种gui* qt和gdk两个开源工具跨平台开发库* 发行版和gui之间的关系###### 我们一起来回顾一下整个学习过程* 我们从零开始* ...