数据库(mysql)SQL优化及索引优化

一、常见的SQL执行顺序

手写:
select -> from -> where -> group by -> having -> order by -> limit

机读顺序:
from -> where -> group by -> having -> select -> order by -> limit

图解:
在这里插入图片描述

二、索引简介

2.1、索引是帮助mysql高效获取数据的一种数据结构
本质:“排好序的快速查找数据结构”

2.2、创建索引的语法:
create index 索引名 on 表名(列名1, 列名2, …)
alter table 表名 add index 索引名(列名1,列名2,…)

2.3、哪些情况下需要创建索引

  1. 主键自动创建唯一索引
  2. 频繁作为查询条件的字段应该创建索引
  3. 查询中与其他表关联的字段,外键关系创建索引
  4. 查询中排序的字段
  5. 查询中统计或者分组的字段

2.4、哪些情况下不必创建索引

  1. 表记录太少
  2. 经常增删改表
  3. 数据重复且分布平均的表

三、explain

3.1、解释:
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道mysql是如何处理你的sql语句,分析你的查询语句或者表结构的性能瓶颈

3.2、能干什么

  1. 表的读取顺序
  2. 数据读取操作的操作类型
  3. 哪些索引可以使用
  4. 哪些索引实际被使用
  5. 表之间的引用
  6. 每张表有多少行被优化查询

3.3、用法:
在你的SQL语句前面加上 explain 关键字即可
例如:explain select id,name,age from student

3.4、执行结果分析
在这里插入图片描述
1)id:select查询的序号,包含一组数字
a:id相同,执行顺序由上至下
b:id不同,id值越大优先级越高越先执行
c:id相同不同,两个都存在,id如果相同,可以认为是一组,从上到下执行;在所有组中,id越大,优先级又高,越先执行

2)select_type
在这里插入图片描述
SIMPLE:简单的select查询,查询中不包含子查询或者UNION
PRIMARY:查询中若包含任何复杂的子查询,最外层查询则被标记为
SUBQUERY:在select或where列表中包含了子查询
DERIVED:在FROM列表中包含了子查询被标记为DERIVED(衍生) Mysql会递归执行这些子查询,把结 果放在临时表里。
UNION:若第二个selsct出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询 中,外层select将标记为DERIVED
UNION RESULT:从UNION表获取结果的select

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、索引优化

索引失效

  1. 最佳匹配我最爱
  2. 最佳左前缀法则
  3. 不在索引列上做任何计算
  4. 存储引擎不能使用索引中范围条件右边的列
  5. 尽量使用索引覆盖
  6. mysql在使用不等于的时候无法使用索引会导致全表扫描
  7. is null, is not null 无法使用索引
  8. like 以通配符开头(‘%abc…’)mysql索引会失效
  9. 字符串不加单引号索引会失效
  10. 少用or,用它连接时索引会失效
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值