mysql 索引,以及sql优化总结
sql问题
where执行顺序
如果查询的所有条件都没有索引,则不分先后顺序(在500W数据下试过,没有太大差别),如果有索引,mysql会根据sql条件进行优化,比如先执行查询符合索引的条件。
下面这个因为test2表的a字段是索引,所以会先执行a的条件
在where都有索引的情况下 按照from的顺序
在where都无索引的情况下
join的问题
小表驱动大表,减少遍历次数
小表(筛选条件后) left join 大表(筛选条件后)。
count的问题
count(1),count(*) 统计所有行,包含值为null的
count(字段) 值统计不为null的。
具体来说 count(1)和count(*) 没有太大区别。
如果表没有主键,那么count(1)比count(*)快。
如果有主键,那么count(主键,联合主键)比count(*)快。
如果表只有一个字段,count(*)最快。
联合索引
基础
讲联合索引,一定要扯最左匹配!放心,我不扯有的没的,几句话懂个大概就行!
最左匹配
所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配。
假设,我们对(a,b)字段建立一个索引,也就是说,你where后条件为
a = 1
a = 1 and b = 2
是可以匹配索引的。但是要注意的是~你执行
b= 2 and a =1
也是能匹配到索引的,因为Mysql有优化器会自动调整a,b的顺序与索引顺序一致。 相反的,你执行
b = 2
就匹配不到索引了。 而你对(a,b,c,d)建立索引,where后条件为
a = 1 and b = 2 and c > 3 and d = 4
那么,a,b,c三个字段能用到索引,而d就匹配不到。因为遇到了范围查询!
最左匹配的原理?
假设,我们对(a,b)字段建立索引,那么入下图所示
如图所示他们是按照a来进行排序,在a相等的情况下,才按b来排序。
因此,我们可以看到a是有序的1,1,2,2,3,3。而b是一种全局无序,局部相对有序状态! 什么意思呢?
从全局来看,b的值为1,2,1,4,1,2,是无序的,因此直接执行b = 2
这种查询条件没有办法利用索引。
从局部来看,当a的值确定的时候,b是有序的。例如a = 1时,b值为1,2是有序的状态。当a=2时候,b的值为1,4也是有序状态。 因此,你执行a = 1 and b = 2
是a,b字段能用到索引的。而你执行a > 1 and b = 2
时,a字段能用到索引,b字段用不到索引。因为a的值此时是一个范围,不是固定的,在这个范围内b值不是有序的,因此b字段用不上索引。
综上所示,最左匹配原则,在遇到范围查询的时候,就会停止匹配。
实战
OK,懂上面的基础,我们就可以开始扯了~我举了经典的五大题型,看完基本就懂!
注意如果 建立了(a,b,c)的联合索引,where a,b,c 和 where a,c,b 的条件顺序没有区别,musql会自动优化。
题型一
如果sql为
SELECT * FROM table WHERE a = 1 and b = 2 and c = 3;
如何建立索引?
如果此题回答为对(a,b,c)建立索引,那都可以回去等通知了。 此题正确答法是,(a,b,c)或者(c,b,a)或者(b,a,c)都可以,重点要的是将区分度高的字段放在前面,区分度低的字段放后面。像性别、状态这种字段区分度就很低,我们一般放后面。
例如假设区分度由大到小为b,a,c。那么我们就对(b,a,c)建立索引。在执行sql的时候,优化器会 帮我们调整where后a,b,c的顺序,让我们用上索引。
题型二
如果sql为
SELECT * FROM table WHERE a > 1 and b = 2;
如何建立索引?
如果此题回答为对(a,b)建立索引,那都可以回去等通知了。 此题正确答法是,对(b,a)建立索引。如果你建立的是(a,b)索引,那么只有a字段能用得上索引,毕竟最左匹配原则遇到范围查询就停止匹配。 如果对(b,a)建立索引那么两个字段都能用上,优化器会帮我们调整where后a,b的顺序,让我们用上索引。
题型三
如果sql为
SELECT * FROM `table` WHERE a > 1 and b = 2 and c > 3;
如何建立索引? 此题回答也是不一定,(b,a)或者(b,c)都可以,要结合具体情况具体分析。
拓展一下
SELECT * FROM `table` WHERE a = 1 and b = 2 and c > 3;
怎么建索引?嗯,大家一定都懂了!
题型四
SELECT * FROM `table` WHERE a = 1 ORDER BY b;
如何建立索引? 这还需要想?一看就是对(a,b)建索引,当a = 1的时候,b相对有序,可以避免再次排序! 那么
SELECT * FROM `table` WHERE a > 1 ORDER BY b;
如何建立索引? 对(a)建立索引,因为a的值是一个范围,这个范围内b值是无序的,没有必要对(a,b)建立索引。
拓展一下
SELECT * FROM `table` WHERE a = 1 AND b = 2 AND c > 3 ORDER BY c;
怎么建索引?
题型五
SELECT * FROM `table` WHERE a IN (1,2,3) and b > 1;
如何建立索引?
还是对(a,b)建立索引,因为IN在这里可以视为等值引用,不会中止索引匹配,所以还是(a,b)!
拓展一下
SELECT * FROM `table` WHERE a = 1 AND b IN (1,2,3) AND c > 3 ORDER BY c;
如何建立索引?此时c排序是用不到索引的。
mysql 索引,以及sql优化总结相关推荐
- Mysql索引,SQL优化
注:此文部分内容来自b站黑马程序员mysql高级课程 1. 索引 1.1 索引概述 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序).在数据之外,数据库系 ...
- MySQL索引,SQL优化一网打尽
2-3W字长文警告!!!! 索引概述 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序).在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据 ...
- MySQL索引及其SQL优化
文中将分为四个方面去了解一下MYSQL5.7 1,mysql索引的数据结构 1.1 索引的定义 索引是帮助MySQL高效获取数据的排好序的数据结构,索引是一个排序的列表,在这个列表中存储着索引的值和包 ...
- mysql添加二级索引的sql语句_MySQL面试知识点追命连环问(二)事务、索引及SQL优化...
目录 上次我们讨论了MySQL的运行流程及原理,字段设计,存储引擎和查询缓存. 这次我们继续来追命连环问关于事务,索引,SQL优化等相关的内容.准备好了吗?事务 索引 SQL优化 常见问题 1. M ...
- MySQL索引分析和优化(转)
MySQL索引分析和优化(转) 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记 录,直至找到符 ...
- 【数据库】第三章 事务、索引和SQL优化
[数据库]第三章 事务.索引和SQL优化 文章目录 [数据库]第三章 事务.索引和SQL优化 一.事务 1.原子性 2.持久性 3.隔离性 4.一致性 二.索引 1.介绍 2.分类 3.底层实现 4. ...
- MySQL进阶之SQL优化
1.使用 show status like 'Com%';可以查到各种语句执行的次数. Com_select:执行select操作的次数. Com_insert:执行insert的次数 Com_upd ...
- (2)Mysql索引原理和优化总结
Mysql设计原理栏目总结 (1)Mysql架构和常用引擎介绍 (2)Mysql索引原理和优化总结 1.索引理解和常见面试题 (1)本质 索引是一种能够高效获取数据的数据结构 索引存放在硬盘上 (2) ...
- MySQL数据库与SQL优化
一.MySQL 数据库与 SQL 优化 1.结构图 二.MySQL 数据库引擎简介 1.ISAM(IndexedSequentialAccessMethod) ISAM 是一个定义明确且历经时 ...
- 文件服务器索引失效,SQL优化 MySQL版 – 避免索引失效原则(一)
避免索引失效原则(一) 精力有限,剩余的失效原则将会在 <避免索引失效原则(二)>中连载出来,请谅解 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 避免索引失效的一些原 ...
最新文章
- 01矩阵等比放大(Java代码、ACM格式)--2021.9.7百度笔试研发A卷
- 第十六届智能车竞赛安徽赛区成绩与奖项公示
- quot;正统quot;函数式编程 两个规则
- C++primer第十章 泛型算法 10.1 概述 10.2 初识泛型算法
- HomeBrew 更换为国内源--提高brew命令操作速度
- 关于max(X,Y),min(X,Y)
- 学习V神的手把手教你写脚本引擎 一
- eclipse 史上最舒服(且护眼) 字体+大小+配色 教程(强推!!)
- 原码,补码,反码概念和计算方法详解
- TM1650芯片使用经验
- UG NX二次开发-外部模式
- 第16届东北四省赛题解
- 解决VM虚拟机连不上网络的问题
- Mac OS X 10.8.5升级到更高版本的方法
- JavaSE基础 打印杨辉三角
- 荣耀magic book忘记pin,只能用pin登录,还着急用电脑里的文件
- 一文读懂IBIS模型
- 图像处理之特征提取(一)之HOG特征简单梳理
- Github 上的个人项目开源心得
- 视频号扩展链接一键转换文章链接
热门文章
- pika.exceptions.ChannelClosed: (406, “PRECONDITION_FAILED - parameters for queue ‘test‘ in vhost ‘/
- Python科学计算之Numpy数组形状与连接
- Windows锁屏界面图片不更新
- wordpress排版插件_16个最佳WordPress排版插件,可改善您的设计
- SpringBoot Referer防盗链
- BUAA北航2021期末数据结构B题
- 一个程序员的水平能差到什么程度?尼玛,都是人才呀...
- 手机上可随时随地打印文件的软件有哪些
- php的ksort函数,ksort函数怎么用
- android获取手机通讯录联系人