晚上睡不着,脑子里总想着一些问题,试着写一写对于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优化的更多相关文章

  1. SQL优化案例—— RowNumber分页

    将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...

  2. sql 优化

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

  3. SQL 优化总结

    SQL 优化总结 (一)SQL Server 关键的内置表.视图 1. sysobjects         SELECT name as '函数名称',xtype as XType  FROM  s ...

  4. (转)SQL 优化原则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  5. sql优化阶段性总结以及反思

    Sql优化思路阶段性心得: 这段时间的优化做了好几个案例,其实有很多的类似点,都是好几张大表的相互连接,然后执行长达好几个小时,甚至都跑不出来. 自己差不多的思路就是Parallel full tab ...

  6. mysql sql优化实例

    mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...

  7. SQL优化技巧

    我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ...

  8. ORACLE常用SQL优化hint语句

    在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...

  9. SQL优化有偿服务

    本人目前经营MySQL数据库的SQL优化服务,100块钱一条.具体操作模式 其中第一条,可以通过在微信朋友圈转发链接中的信息(http://www.yougemysqldba.com/discuz/v ...

  10. 【MySQL】SQL优化系列之 in与range 查询

    首先我们来说下in()这种方式的查询 在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的. ...

随机推荐

  1. C++中UNIX时间戳与日期互转

    C++中UNIX时间戳与日期互转 使用time.h头文件 localtime 可以把时间戳转为 tm 结构体, tm结构体中可以格式化输出时间 mktime可以把tm结构体转为时间戳 tm 结构体中: ...

  2. 一次STM32进入HardFault_Handler 的解决情况

    STM32进入HardFault_Handler调试 --- title: STM32进入HardFault_Handler调试 date: 2020-06-18 10:26:48 categorie ...

  3. Freertos学习:00-介绍

    --- title: rtos-freertos-000-介绍 EntryName: rtos-freertos-00-about date: 2020-06-09 23:21:44 categori ...

  4. HTTP 协议学习:1-HTTP概述

    背景 原文:HTTP概述 HTTP是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议).它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说, ...

  5. linux 4.19 ip重组

    IP重组 ip重组这部分 4.19内核与3.10内核有些差别,4.9.134以后内核中不使用低水位和工作队列了,同时使用了rhashtable 替代了 hash bucket的概念,在3.10内核中使 ...

  6. 谈谈你对 Vue 生命周期的理解?

    生命周期是什么? Vue 实例有一个完整的生命周期,也就是从 开始创建.初始化数据.编译模版.挂载 Dom -> 渲染.更新 -> 渲染.卸载等一系列过程,我们称这是 Vue 的生命周期. ...

  7. DeepViT:字节提出深层ViT的训练策略 | 2021 arxiv

    作者发现深层ViT出现的注意力崩溃问题,提出了新颖的Re-attention机制来解决,计算量和内存开销都很少,在增加ViT深度时能够保持性能不断提高 来源:晓飞的算法工程笔记 公众号 论文: Dee ...

  8. 算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient

    大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今日 216/10000 抱个拳,送个礼 神经网络设计与选择 参数初始化与优化 学习率 ...

  9. 前端系列-HTML5新特性

      HTML5 引入了许多新特性和改进,其中包括但不限于: 语义化标签:新增了像 <header>.<footer>.<nav>.<article>.& ...

  10. 【算法】在vue3的ts代码中分组group聚合源数据列表

    有一个IList<any>()对象列表, 示例数据为[{id:'1',fieldName:'field1',value:'1'},{id:'1',fieldName:'field2',va ...