介绍:本篇笔记粗糙介绍sql查询优化问题,比如单表如何查、链接查如何查、mysql怎么优化
sq、如何选择最低成本查询、如何看explain。知道这些可以明白sql执行的部分过程和sql具体如何
优化的依据。
一、单表访问方法
sql语句就是一段描述我要什么样数据的文本。mysql接收后解析器解析然后交给优化器优化,优化的
结果就是一个执行计划。它表明了mysql会根据什么样的方法去找到符合你描述的数据,并返回到客户
端。查询优化很复杂,先看看from后只有一个表怎么查,打打基础。
访问方法:mysql执行查询语句的方式。
1. const:通过主键|唯一二级索引与常数的等值比较,形成单点扫描区间;
2. ref:使用普通二级索引与常数的等值比较,形成单点扫描区间;
3. ref_or_null:比ref多了一个扫描区间[null,null](null这样的索引列一般在索引树最左边);
4. eq_ref:这个是多表连查时,被驱动表采用主键或唯一二级索引与常数的等值比较;
5. range:使用普通二级索引,对应的扫描区间为若干淡点扫描区间or范围扫描区间;
6. index:扫描全部二级索引记录,并且不用执行回表操作(例如查询列使用了覆盖索引);
7. all:扫描全部聚簇索引记录(兜底的访问方法);
使用索引减少需要扫描的记录数量时,一般只会为单个索引生成扫描区间,比如上边的;下边介绍
什么情况下会为多个索引生成扫描区间:
interSection交集的索引合并:等值时获取到的二级索引记录主键值有序
union并集的索引合并:等值时获取到的二级索引记录主键值有序
sort-Union:先排序后索引合并,a1>'a'.a2<'c'扫描出两个区间的主键排序后,使用interSection合并
二、join连接的原理
1. 连接过程简介:首先确定第一个需要查的表(驱动表),从驱动表中找到的每条记录都需要到另
一张表中查找匹配的记录。(每获得一条驱动表记录就到被驱动表寻找匹配的记录,驱动表访问
一次,被驱动表看驱动表中有多少数据就访问多少次—随机i/o耗费时间)
2. 内连接-外连接:
1. 对于内连接的两表,驱动表中的记录在被驱动表找不到匹配的记录,则不会加入到结果集;
2. 对于外连接的两表,驱动表中的记录在被驱动表找不到匹配的记录,也会被加入到结果集;
对于外连接来说,有时也不想爸驱动表的记录全部加入到最后的结果集,所以:
where : 不管内-外连接,凡不符合where子句中过滤条件都不会加入到结果集中;
on : 驱动表中记录找不到被驱动表与之匹配的记录也会被加入到最终的结果集;
on专门为"外连接驱动表中的记录在被驱动表中查不到匹配记录是否把驱动表记录加入结果集"的
场景提出的
前面两点是铺垫,接下来是重头戏,可解释为什么有的连接快如闪电,有的慢如蜗牛: