mysql 查询优化~sql优化通用
一 简介:今天我们来探讨下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优化通用的更多相关文章
- 基于MySQL 的 SQL 优化总结
文章首发于我的个人博客,欢迎访问.https://blog.itzhouq.cn/mysql1 基于MySQL 的 SQL 优化总结 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务.例行 ...
- mysql的sql优化案例
前言 mysql的sql优化器比较弱,选择执行计划貌似很随机. 案例 一.表结构说明mysql> show create table table_order\G***************** ...
- 我的mysql数据库sql优化原则
原文 我的mysql数据库sql优化原则 一.前提 这里的原则 只是针对mysql数据库,其他的数据库 某些是殊途同归,某些还是存在差异.我总结的也是mysql普遍的规则,对于某些特殊情况得特殊对待. ...
- MySQL之SQL优化详解(二)
目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...
- 【MySQL】SQL优化系列之 in与range 查询
首先我们来说下in()这种方式的查询 在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的. ...
- mysql索引sql优化方法、步骤和经验
MySQL索引原理及慢查询优化 http://blog.jobbole.com/86594/ 细说mysql索引 https://www.cnblogs.com/chenshishuo/p/50300 ...
- (1.10)SQL优化——mysql 常见SQL优化
(1.10)常用SQL优化 insert优化.order by 优化 1.insert 优化 2.order by 优化 [2.1]mysql排序方式: (1)索引扫描排序:通过有序索引扫描直接返回有 ...
- MySQL 慢 SQL & 优化方案
1. 慢 SQL 的危害 2. 数据库架构 & SQL 执行过程 3. 存储引擎和索引的那些事儿 3.1 存储引擎 3.2 索引 4. 慢 SQL 解决之道 4.1 优化分析流程 4.2 执行 ...
- MySQL之SQL优化详解(一)
目录 慢查询日志 1. 慢查询日志开启 2. 慢查询日志设置与查看 3.日志分析工具mysqldumpslow 序言: 在我面试很多人的过程中,很多人谈到SQL优化都头头是道,建索引,explai ...
随机推荐
- linux 内核参数优化----最大线程数限制及当前线程数查询
1.总结系统限制有: /proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值 /proc/sys/kernel/thread-max max_user_p ...
- POJ3176-基础DP
很基础的dp题.有一头奶牛想接尽量多的苹果,有w此移动机会. dp[i][w] = max(dp[i-1][w+1] + 能否吃到苹果 ,dp[i-1][w] + 能否吃到苹果) //从上一分钟是否 ...
- Problem B. Harvest of Apples HDU - 6333(莫队)
Problem Description There are n apples on a tree, numbered from 1 to n.Count the number of ways to p ...
- git pull报“unable to update local ref”解决方案
使用git pull拉取代码的时候,无法拉取最新代码,报"unable to update local ref"错误. 除了重新clone一份代码外,还可以使用如下解决方案: 1. ...
- 自学Linux Shell15.1-处理信号
点击返回 自学Linux命令行与Shell脚本之路 15.1-处理信号 Linux使用信号与系统上运行的进程进行通信.可以使用这些信号控制Shell脚本的运行,只需要让shell脚本在接收到来自Lin ...
- 【bzoj3532】 Sdoi2014—Lis
http://www.lydsy.com/JudgeOnline/problem.php?id=3532 (题目链接) 题意 给出$n$个数的数列,三个值$a[i],b[i],c[i]$.将其中一些数 ...
- Learn Python The Hard Way, 2nd Edition
看完了这本书,你决定继续做编程.也许它能成为你的一个职业,也许它能成为你的一项爱好.但你需要一些指导,确保自己不会走错了道路,或帮助你从这个新业余爱好中得到最大的乐趣. 我做了很久的编程.久的你都想象 ...
- Windows 10 MBR转GPT
Windows 10的创意者更新中,新增了mbr2gpt命令行工具,只需简单几步快速搞定分区表的转换 语法 MBR2GPT /validate|convert [/disk:] [/logs:] [/ ...
- 使用sass切图
明日复明日,明日何其多!我生待明日,万事成蹉跎!ruby挺可爱的.没有进入工程项目中使用sass. 尝试是一件快乐的事情.在页面中直接引进编译出来的css即可.
- Solr7.1--- 生产环境搭建
准备三台虚拟机,把Solr-7.1.0.tgz上传到三个节点上.我上传到了自定义的目录/mysoft. 我的环境是CentOS7+Solr7.1.0 如果发现图文不符,因为我之前操作截图后,关闭出去吃 ...