一, MySQL 的执行顺序
MySQL 执行 sql 的顺序从 From 开始, 以下是执行的顺序流程
1,FROM table1 left join table2 on 将 table1 和 table2 中的数据产生笛卡尔积, 生成 Temp1
2,JOIN table2 所以先是确定表, 再确定关联条件
3,ON table1.column = table2.columu 确定表的绑定条件 由 Temp1 产生中间表 Temp2
4,WHERE 对中间表 Temp2 产生的结果进行过滤 产生中间表 Temp3
5,GROUP BY 对中间表 Temp3 进行分组, 产生中间表 Temp4
6,HAVING 对分组后的记录进行聚合 产生中间表 Temp5
7,SELECT 对中间表 Temp5 进行列筛选, 产生中间表 Temp6
8,DISTINCT 对中间表 Temp6 进行去重, 产生中间表 Temp7
9,ORDER BY 对 Temp7 中的数据进行排序, 产生中间表 Temp8
10,LIMIT 对中间表 Temp8 进行分页, 产生中间表 Temp9
二, MySQL 的执行计划
1, 什么是执行计划
执行计划就是 sql 的执行查询的顺序, 以及如何使用索引查询, 返回的结果集的行数
2, 执行计划的内容
1.id sql 执行计划的顺序 或子查询表的执行顺序
id 一样, 按照顺序执行; id 越大, 执行的优先级就越高 (如子查询)
2.select_type 表示查询中每个 select 子句的类型
a.SIMPLE: 查询中不包含子查询或者 UNION
b. 查询中若包含任何复杂的子部分, 最外层查询则被标记为: PRIMARY
c. 在 SELECT 或 WHERE 列表中包含了子查询, 该子查询被标记为: SUBQUERY
d. 在 FROM 列表中包含的子查询被标记为: DERIVED(衍生)
e. 若第二个 SELECT 出现在 UNION 之后, 则被标记为 UNION; 若 UNION 包含在 FROM 子句的子查询中, 外层 SELECT 将被标记为: DERIVED
f. 从 UNION 表获取结果的 SELECT 被标记为: UNION RESULT
3.type
MySQL 在表中找到所需行的方式, 又称 "访问类型", 常见类型如下:
由左至右, 由最差到最好
ALL: 全表扫描
index:index 类型只遍历索引树
索引的存在形式是文件, 按存储结构划分):FULLTEXT,HASH,BTREE,RTREE.
对应存储引擎支持如下:
转载 MySQL 索引: http://blog.csdn.net/jesseyoung/article/details/38037543
range: 索引范围扫描
对索引字段进行范围查询, 使用 in 则是使用 rang 范围查询; 使用 ">" ,"<" 或者 "between" 都是可以使用索引的, 但是要控制查询的时间范围, 一般查询数据不要超过数据总数的 15%
ref: 非唯一性索引
类似 select count(1) from age = '20';
eq_ref: 唯一性索引扫描, 对于每个索引键, 表中只有一条记录与之匹配. 常见于主键或唯一索引扫描
4.key
表示在执行语句用到的索引
查询中若使用了覆盖索引, 则该索引仅出现在 key 列表中
覆盖索引: 查询数据只需要通过索引就可以查询出, 如 55 万条数据, 使用索引, 立刻可以查询出 2000 条数据, 同时 Extra 字段是 Using index
5.Extra
Using index : 使用覆盖索引的时候就会出现
using index condition: 查找使用了索引, 但是需要回表查询数据
Using where : 在查找使用索引的情况下, 需要回表去查询所需的数据
using index & using where: 查找使用了索引, 但是需要的数据都在索引列中能找到, 所以不需要回表查询数据
Using temporary: 需要使用临时表来存储结果集, 常见于排序和分组查询
Using filesort: 无法利用索引完成的排序操作称为 "文件排序";
很多场景都是索引是一个字段, order by 排序的字段与索引字段不一致, 导致的 Using fileSort;
此时可以给排序字段和 where 条件字段, 添加为组合索引, 同时保证索引查询的数据不超过总量的 15%, 避免 fileSort
注: 回表的含义是, 先根据索引查询数据, 然后在根据确定的数据 id 和查询条件再去查询具体的数据的过程
来源: http://www.bubuko.com/infodetail-3329282.html