一 简介:今天我们来探讨下SQL语句的优化基础

二 基础规则:

一 通用:

1 避免索引字段使用函数
     2 避免发生隐式转换
     3 order by字段需要走索引,否则会发生filesort
     4 当需要得到的数据量占用表的数据量很大比例的时候,数据库可能不会采用索引而选择全表扫描
     5 复合索引要注意最左原则
     6 尽量用union all 代替union

7 利用 mysql 5.7的虚拟列特性

8 利用临时表防范汇总临时结果

二 多表:
    1 对于子查询要具体情况具体分析(子查询和join查询可能会相互改写转化)
    2 explain所看到的第一张表为驱动表,尽量减少扫描驱动表的行数
    3 多表联查一定要避免笛卡尔积
    4 要注意分页查询的优化
    5 join表时一定要将所有连接字段赋予索引(非常重要)

6 多表查询善用 STRAIGHT_JOIN

三  函数处理

1 采用not null is null 代替 ifnull函数,ifnull函数会降低查询性能

四 基础原理:
 1 驱动表的优化原理
优化的目标是尽可能减少JOIN中Nested Loop的循环次数,以此保证:永远用小结果集驱动大结果集(Important!)!:A JOIN B,A为驱动,A中每一行和B进行循环JOIN,看是否满足条件,所以当A为小结果集时,越快。
NestedLoopJoin实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与Join,则再通过前两个表的Join结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复

五  什么情况下不会用到索引

1 不符合联合索引最左原则

2  where条件中有or not in not exits等

3 like查询是以%开头

4 查询条件存在隐式转换

5 查询条件存在函数运算

6 优化器认为全表扫描的成本低于索引扫描

但是切记 由于mysql5.6的ICP特性,以上情况下可能会出现ICP特性(索引的二次过滤)

六  总结

1 一半以上的慢语句都可以通过加索引解决问题(单列索引+联合索引)

2 如果可以直接停掉的慢语句直接停掉就可以

3 对剩下慢语句 可以采用拆分+改写的方式进行

4 SSD的更换能减少随机IO的发生,提升查询效率

七 特性

icp 特性

查询流程 server层->innodb engine->数据文件
ICP特性
1 ICP可以减少存储引擎必须访问基表的次数以及MySQL服务器必须访问存储引擎的次数
2 ICP用于 range, ref, eq_ref,和 ref_or_null访问方法时,有必要访问完整的表行。
3 ICP仅用于二级索引。ICP的目标是减少全行读取的数量,从而减少I / O操作,可以理解成在server层二次过滤

八 联合索引的key_len计算方式

1 所有的索引字段,如果没有设置not null,则需要加一个字节。
  2.定长字段,int占四个字节,bigint占八个字、char(n)占n个字符。

3 DATE 3 个字节 DATETIME 8 个字节 TIMESTAMP 4 个字节
  4.对于变成字段varchar(n),则有n个字符+两个字节。
  5.不同的字符集,一个字符占用的字节数不同。latin1编码的,一个字符占用一个字节,gbk编码的,一个字符占用两个字节,utf8编码的,一个字符占用三个字节 utf8mb4编码的,一个字符占用4个字节

6 key_len只指示了where中用于条件过滤时被选中的索引列,是不包含order by/group by这一部分被选中的索引列的,所以可能存在排序用到索引但是key_len不对等的情况,这里要注意

INNODB的索引会限制单独Key的最大长度为767字节,联合索引的单列项同样如此

九  STRAIGHT_JOIN 一些注意点

1 STRAIGHT_JOIN 只适用于inner join,因为其他join都指定了顺序
  2 STRAIGHT_JOIN 在多表join情况下都必须进行替换
  3 STRAIGHT_JOIN 目的就是调整驱动表选择的顺序
  4 table1 STRAIGHT_JOIN table2 STRAIGHT_JOIN table3 table1会优先table2载入,table2会优先table3
  5 STRAIGHT_JOIN 并不改写sql表本身的条件书写顺序

mysql 查询优化~sql优化通用的更多相关文章

  1. 基于MySQL 的 SQL 优化总结

    文章首发于我的个人博客,欢迎访问.https://blog.itzhouq.cn/mysql1 基于MySQL 的 SQL 优化总结 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务.例行 ...

  2. mysql的sql优化案例

    前言 mysql的sql优化器比较弱,选择执行计划貌似很随机. 案例 一.表结构说明mysql> show create table table_order\G***************** ...

  3. 我的mysql数据库sql优化原则

    原文 我的mysql数据库sql优化原则 一.前提 这里的原则 只是针对mysql数据库,其他的数据库 某些是殊途同归,某些还是存在差异.我总结的也是mysql普遍的规则,对于某些特殊情况得特殊对待. ...

  4. MySQL之SQL优化详解(二)

    目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...

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

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

  6. mysql索引sql优化方法、步骤和经验

    MySQL索引原理及慢查询优化 http://blog.jobbole.com/86594/ 细说mysql索引 https://www.cnblogs.com/chenshishuo/p/50300 ...

  7. (1.10)SQL优化——mysql 常见SQL优化

    (1.10)常用SQL优化 insert优化.order by 优化 1.insert 优化 2.order by 优化 [2.1]mysql排序方式: (1)索引扫描排序:通过有序索引扫描直接返回有 ...

  8. MySQL 慢 SQL & 优化方案

    1. 慢 SQL 的危害 2. 数据库架构 & SQL 执行过程 3. 存储引擎和索引的那些事儿 3.1 存储引擎 3.2 索引 4. 慢 SQL 解决之道 4.1 优化分析流程 4.2 执行 ...

  9. MySQL之SQL优化详解(一)

    目录 慢查询日志 1. 慢查询日志开启 2. 慢查询日志设置与查看 3.日志分析工具mysqldumpslow   序言: 在我面试很多人的过程中,很多人谈到SQL优化都头头是道,建索引,explai ...

随机推荐

  1. Django的datetime.timedelta类(Django编程-2)

    datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减就可以返回一个timedelta对象. 如果有人问你昨天是几号,这个很容易就回答出来了.但是如果 ...

  2. linux screen 命令 :离线运行程序

    screen工具是linux下虚拟终端的一个常用工具.在 发现这个工具之前,笔者经常在远程ssh中运行需要长时间处理数据的命令,比如远程编译安装软件,如果在编译的过程中网络断开,那这个编译进程就会停止 ...

  3. 架构师成长之路7.1 CDN理论

    点击返回架构师成长之路 架构师成长之路7.1 CDN理论 CDN,Content Distribute Network,内容分发网络:CDN解决的是如何将数据快速可靠从源站传递到用户的问题.用户获取数 ...

  4. virtualenv 包管理

    创建虚拟环境: 1) pip install virtualenv 2) virtualenv  DemoEnv(虚拟环境名) 3) 此处windows和linux不同系统下的文件结构略有不同 lin ...

  5. UVALive - 6436(DFS)

    题目链接:https://vjudge.net/contest/241341#problem/C 题目大意:给你从1到n总共n个数字,同时给你n-1个连接,同时保证任意两个点之间都可以连接.现在假设任 ...

  6. bzoj3698 XWW的难题

    题意:给你个n * n的实数矩阵,你需要把它中的每个数上/下取整,并满足如下条件: 每行最后一个数等于前面的和. 每列最后一个数等于前面的和. n行n列的那个元素始终为0,不予考虑. 求满足条件下矩阵 ...

  7. 一起使用mock数据动态创建表格

    在ant-design中,我们创建一个基础table会怎么实现呢? 如下代码可视,我们会自己创建一些数据,在表格中渲染出来,如下 <Card title="基础表格"> ...

  8. 外显子分析弹错解决方案:Exception in thread "main" picard.PicardException: New reference sequence does not contain a matching contig for NC_007605

    最近从公共数据库下载了一堆bam文件和reference 基因组文件,重新分析外显子流程时,跑出了“Exception in thread "main" picard.Picard ...

  9. 十二、java_网络编程

    目录: 一.网络基础 二.TCP/IP协议 三.IP地址 四.Socket通信 一.网络基础 什么是计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系 ...

  10. mac 上sublime3安装编码插件

    我们常常会遇到这样的问题:我们使用 mac 的时候,从 windows 上接受过来的文档通过 sublime3打开之后就是乱码,这个时候需要安装相对应的编码插件才能正常查看. 1. 打开 sublim ...