一 简介:今天我们来探讨下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. Hadoop源码分析之FileSystem抽象文件系统

    Hadopo提供了一个抽象的文件系统模型FileSystem,HDFS是其中的一个实现. FileSystem是Hadoop中所有文件系统的抽象父类,它定义了文件系统所具有的基本特征和基本操作. Fi ...

  2. jenkins--svn+Email自动触发1(作业设置)

    项目名称设置: svn设置: 触发构建设置: 构建加入sonar-scanner代码扫描: 邮件设置: 邮件触发器配置:

  3. [IOI2018]排座位——线段树

    题目链接: IOI2018seat 题目大意:给出一个$H*W$的矩阵,将$0 \sim W*H-1$分别填入矩阵的格子里(每个格子里一个数),定义一个子矩阵是美妙的当且仅当这个子矩阵包含且仅包含$0 ...

  4. BZOJ 4754 [JSOI2016]独特的树叶 | 树哈希判同构

    题目链接 这道题是一道判断无根树同构的模板题,判断同构主要的思路就是哈希. 一遇到哈希题,一百个人能有一百零一种哈希方式,这篇题解随便选用了一种--类似杨弋<Hash在信息学竞赛中的一类应用&g ...

  5. 洛谷 P2059 [JLOI2013]卡牌游戏 解题报告

    P2059 [JLOI2013]卡牌游戏 题意 有\(n\)个人玩约瑟夫游戏,有\(m\)张卡,每张卡上有一个正整数,每次庄家有放回的抽一张卡,干掉从庄家起顺时针的第\(k\)个人(计算庄家),干掉的 ...

  6. JDK源码分析(5)Vector

    JDK版本 Vector简介 /** * The {@code Vector} class implements a growable array of * objects. Like an arra ...

  7. HDU 1029 Ignatius and the Princess IV / HYSBZ(BZOJ) 2456 mode(思维题,~~排序?~~)

    HDU 1029 Ignatius and the Princess IV (思维题,排序?) Description "OK, you are not too bad, em... But ...

  8. 【uoj336】【清华集训2017】无限之环

    题目 描述 ​ 给出一个\(n*m\)的网格,每个格子里的水管可能向四个方向都有接口: ​ 游戏的目的是不能让水管漏水,即所有接口都有另一个接口与之相接: ​ 你一步可以将一个格子中的水管旋转\(90 ...

  9. iptables限制同一IP连接数,防防CC/DDOS攻击

    启动sftp本机的iptables防火墙功能,限制每个ip连接22端口(sftp连接端口即是ssh端口)最大为50个,当超过50后的连接数的流量就会被DROP掉! 同时iptables需要开放5000 ...

  10. Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException

    今天在学习spring 框架的时候看着,很简单.但是在真正开始做的时候发现,异常一个接着一个,整的肚子都被搞大了. Exception in thread "main" org.s ...