晚上睡不着,脑子里总想着一些问题,试着写一写对于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. P1551 亲戚 题解。。。

    并查集 目录 并查集 (1.概念: (2.详解 Q1:如何表示不同的家族 ans1: Q2:如何将两个人归到同一个家族中 ans2: CODE: PS: (1.概念: 处理 不相交 可合并 的集合关系 ...

  2. 基于SQLite3的C学习总结

    背景 针对 SQLite3 的学习总结 arm linux 移植 SQLite 3 如何在 Linux 上移植使用 SQLite3,标题虽然是在讲 arm linux,但实际上是跨平台的. 基于 SQ ...

  3. 函数式编程(Lambda、Stream流、Optional等)

    # 声明 文档来源:Github@shuhongfan 源文档:B站UP主:三更草堂 # 函数式编程-Stream流 # 概述 # 为什么学? 基操,否则看不懂别人写的优雅代码 简化代码,不想看到有些 ...

  4. 你有对 Vue 项目进行哪些优化?

    (1)代码层面的优化 v-if 和 v-show 区分使用场景 computed 和 watch 区分使用场景 v-for 遍历必须为 item 添加 key,且避免同时使用 v-if 图片资源懒加载 ...

  5. 物联网浏览器(IoTBrowser)-基于计算机视觉开发的应用“智慧眼AIEye”

    一.起因 最近毕业在家:),准备筹划社区运营和IoTBrowser升级的事务,遇到了一系列物业管理上的问题,本来出于好心提醒物业人员,结果反被误认为是打广告推销的,当时被激怒一下,后面一想也许这也是一 ...

  6. java.net.UnknownHostException: api.weixin.qq.com解决办法

    java.net.UnknownHostException: api.weixin.qq.com at java.net.AbstractPlainSocketImpl.connect(Abstrac ...

  7. 记一次 redis 事件注册不当导致的内存泄露

    线上的程序跑着跑着内存越来越大,并且没有下降的趋势,重启一下程序也只能短暂恢复.通过 htop 命令再按一下 M 键按内存占用大小排个序,程序会占好几个G.那好,让我们来分析一下. 收集dump 通过 ...

  8. 题解:P10723 [GESP202406 七级] 黑白翻转

    背景 汗流浃背了. 分析 容易想到一个显然的思路:以任意节点为根,开始遍历.如果一个节点的子树里面有黑点,那么它必须保留,否则如果它是白点,则可以删去. 但这个方法很容易举出反例: 在这颗树中,如果以 ...

  9. 适用于 .NET 的现代化、流畅、可测试的HTTP客户端库

    前言 今天大姚给大家分享一个.NET开源(MIT License).免费.现代化.流畅.可测试.可移植的URL构建器和HTTP客户端库:Flurl. 项目介绍 Flurl是一个集现代性.流畅性.异步性 ...

  10. 关于异步编程中的bind(this)

    异步编程中的.bind(this)方法解决了异步执行后this指针指向全局函数的问题,主要可以通过以下两个场景加以说明:(本文所用例子基于React场景:为简便起见,仅在第一个例子中展示完整HTML代 ...