一 简介:今天我们来探讨下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. LAMP平台部署

    LAMP平台的概述 LAMP环境脚本部署:https://github.com/spdir/ShellScripts/tree/master/lamp LAMP的介绍:百度百科 LAMP平台的构成组件 ...

  2. ceph API之PHP的S3-SDK包的泛域名解析问题

    安装dns工具包yum -y install bind-utils 安装dns软件 yum install -y dnsmasq 配置dnsmasq的配置文件:/etc/dnsmasq.conf li ...

  3. mvc 验证登录

    很多时候,我们需要多个页面验证用户是否登录 有2中方法. 一种是继承 Attrbuite属性,添加验证,这个可以网上搜索. 我一般使用下面的方式 创建BaseWebController继承Contro ...

  4. 【POI每日题解 #5】 DWU-Double-row

    题目链接 [POI2005]DWU-Double-row wwwww 之前写了半小时 一卡机 没啦QAQ 简单说一下吧 [吐血ing 这道题长得好二分图啊 所以本能地连边 一种是A边 连可交换的数对 ...

  5. Min_25 筛

    Min_25 筛 yyb好神仙啊 干什么用的 可以在\(O(\frac{n^{\frac 34}}{\log n})\)的时间内求积性函数\(f(x)\)的前缀和. 别问我为什么是这个复杂度 要求\( ...

  6. 金三银四:蚂蚁金服JAVA开发面试题及答案之一面(持续更新

    一面 1.自我介绍.自己做的项目和技术领域 开放题 2.项目中的监控:那个监控指标常见的有哪些? 答:CPU.内存.IO 等等.建议下载个nmon工具,里面有各个指标. 数据库:Mysql(缓存命中. ...

  7. 自学Zabbix4.2.1 Application介绍

    自学Zabbix4.2.1 Application介绍 Applications应用程序是item的一个组.例如我们要监控MySQL,我们可以将所有和MySQL相关的item放到这个应用程序中.例如M ...

  8. android progressdialog 对话框试用实例

    ProgressDialog 跟AlertDialog用法差不多,不同的是:ProgressDialog 显示的是一种"加载中"的效果,android 中 ProgressDial ...

  9. 【转】安全加密(三):RFID标签防伪为生活开启安全模式

    本文导读 随着RFID技术的快速发展和RFID电子标签的生产成本不断降低,RFID标签防伪技术的应用也得到了极大的普及,逐步出现在各行各业当中,如交通出行.票务安全.商品防伪等领域. RFID技术简介 ...

  10. 用 Vue 开发一个简单的答题应用(一)

    Vue 之类的 MVVM 框架,能帮助我们用更少的代码实现复杂的业务. 为了简单一点,开发计划分成三阶段: 一,数据写死,实现基本的答题效果.支持多种题型. 二,使用本地存储保存数据,支持题目录入的功 ...