1.为什么需要SQL优化?
不为吃饭,不为工作,单单就是咱SQL写的垃圾!
1.1原因分析
- 性能低
- 执行时间等待时间太长
- SQL语句欠佳(问题的根源在于连接查询)
- 索引失效
5.服务器参数设置不合理(缓冲区-线程数)
1.2 垃圾SQL语句示例与底层解析过程
编写过程
select dinstinct ..from ..join ..on ..where ..group by ...having ..order by ..limit ..
解析过程
from .. on.. join ..where ..group by ....having ...select dinstinct ..order by limit ...
2.重点总结:优化SQL就是优化索引
什么是索引?
- 先说一个十分浅显的定义:相当于书的目录(我们CRUD就比作查字典,就问你查字典没有目录,哥们你难受不!.)
- 在MySQL里用关键字INDEX表示
- 索引是帮助MySQL高效获取数据的数据结构
主要是树形结构:
B树(B数:希望大家心里都有我,因为MySQL就是用的我,作为索引)
Hash树
二叉树
B树的存储特性
- 一句话概括:左轻右重(左边存小的数,右边存大的数)
- 为啥左轻右重?
一般大家是右撇子吧! (博主除外,博主左撇子)你就想想当你陪你新new出来的那倾国倾城的老婆逛街,人家买买买,你给她拎东西,你重的东西肯定右手拎吧!
如下就是B树的索引存储原理
震惊!绝美主播<索引>姑娘可以提高查询效率
所以遇事不决,加索引?
你加一个试试?
项目经理腿都给你打折!
索引弊端
1. 索引本身很大,可以存放在内存/磁盘里(通常放在硬盘)
2. 索引不是什么情况都适用:如
2.1 少量数据
2.2 频繁更新的额字段
2.3 几乎不用的字段
3.索引会降低--增-删-改--的效率(值吗?用在合适的情况下的话就非常值!)
索引优势
1.提高查询效率(说了N次了,换个说法)===>降低IO的使用率
2.降低CPU的使用率 例如
...order by age desc -- 本组排序查询
解析:
因为 B树索引 本身就是一个 好排序的结构,因此在排序时可以直接使用
查询流程与解析顺序不懂的看这里
https://www.cnblogs.com/annsshadow/p/5037667.html
3.BTree(B数)
什么是B树及其检索原理
MySQL为什么选择B树
1.三层BTree可以存上百万数据(不懂脑补IG(三叉戟原理,符合这个原理的可以理解为BTree))
2. B Tree分为==> B+树 B-树 我们普遍是用B+树
3. 一般B树的数据都是存放在叶子节点中
4. B+树中查询任意的数据次数:为N次,那么这个数的高度就是N
4.索引分类与创建(重点)
分类
单值索引(单列) | 一个表可以投多个单值索引() |
---|---|
唯一索引 | 不能重复(id) |
复合索引 | 多个列构成的索引(相当于二级目录) |
创建索引
方式1
create <索引类型> 索引名称 on 表名称
-- 创建单值索引
create index dept_index on ta(dept);
-- 唯一索引
create unique index name_index on tb(name);
-- 创建复合索引
create index dept_name_index on tb(dept,name);
方式2
-- 单值:
alter table tb add index dept_index(dept) ;
-- 唯一:
alter table tb add unique index name_index(name);
-- 复合索引
alter table tb add index dept_name_index(dept,name);
注意:如果一个字段是primary key,则该字段默认就是 主键索引
主键索引与唯一索引最大的区别就是主键索引不能是null
-- 删除索引
drop index 索引名 on 表名 ;
drop index name_index on tb ;
查询索引:
show index from 表名 ;
show index from 表名 \G