一、常见的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、哪些情况下需要创建索引
- 主键自动创建唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其他表关联的字段,外键关系创建索引
- 查询中排序的字段
- 查询中统计或者分组的字段
2.4、哪些情况下不必创建索引
- 表记录太少
- 经常增删改表
- 数据重复且分布平均的表
三、explain
3.1、解释:
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道mysql是如何处理你的sql语句,分析你的查询语句或者表结构的性能瓶颈
3.2、能干什么
- 表的读取顺序
- 数据读取操作的操作类型
- 哪些索引可以使用
- 哪些索引实际被使用
- 表之间的引用
- 每张表有多少行被优化查询
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
四、索引优化
索引失效
- 最佳匹配我最爱
- 最佳左前缀法则
- 不在索引列上做任何计算
- 存储引擎不能使用索引中范围条件右边的列
- 尽量使用索引覆盖
- mysql在使用不等于的时候无法使用索引会导致全表扫描
- is null, is not null 无法使用索引
- like 以通配符开头(‘%abc…’)mysql索引会失效
- 字符串不加单引号索引会失效
- 少用or,用它连接时索引会失效