MySQL查询的本质——单表与多表的查询方法
作者:互联网
单表查询
单表查询的语句实际上是一种声明式的语法,只是告诉MySQL要获取的数据符合哪些规则,至于具体的执行方式是MySQL自己来定。针对不同的场景,也有不同的执行计划:
const
通过主键或者唯一二级索引与常数的等值比较来定位一条记录,是最快的执行方式。主键定位直接返回,而唯一二级索引只需查询一次+回表一次即可返回
ref
较为常见的,在建立二级索引后直接使用其为等值查询条件。因为是等值的,索引会形成单点扫描区间。这种方法称为ref,规则是:搜索条件为二级索引列与常数进行等值比较,形成的扫描区间为单点扫描区间,采用二级索引来执行查询。这种方式的缺点就是每查到一次就回表一次,消耗大。
- 且当二级索引列允许存储null时,都是用此ref方式访问。
- ref允许最左匹配机制,即最左连续列匹配联合索引,就可以使用ref
- 当查询条件不为等值时不能用ref
- Intersection索引合并
- 首先,是全表就不谈了,慢。
- 其次,是使用key1的索引查询,则扫描区间为['a','a'],查询到之后立刻回表,再匹配key3。
- 然后,是按照key3的索引查询,同样的则扫描区间为['b','b'],查询到之后立刻回表,再匹配key1
- 最后,同时使用key1和key3的索引查询。在key1索引中扫描出匹配key1=a的记录,在key3索引中扫描出匹配key1=b的记录。由于在普通二级索引中,重复的索引值会按照主键来排序。所以在这个执行计划中,使用各自的索引扫描出来的记录也是主键排序的。又因为这里使用了 AND,需要查询两者条件都匹配的结果,所以找出两者查询的结果中主键相同的记录,再使用这些相同的主键一并执行回表,这样可能会省下很多回表带来的开销。这就是Intersection索引合并,它要求二级索引是排序的,也就是说我们的查询条件必须是等值的,只有等值才会排序。如果不使用等值条件,则不会使用Intersection索引合并(相当于各自使用ref,最后取重复集)
- Union索引合并
- Sort-Union索引合并
- 单表限制条件。如:key=3或key>1或key<4。只针对key所在的表的限制条件
- 多表限制条件。如:t1.m1=t2.m1、t1.n1<t2.n2。就针对了t1和t2两个表的限制条件。
- WHERE:不分内外连接,只要不匹配WHERE子句的条件,就不加入结果集。
- ON:
- 对于外连接的驱动表来说,如果在被驱动表中找不到匹配ON子句的过滤条件,驱动表的记录还是会加入结果集,被驱动表找不到记录没有关系,填NULL即可。
- 对于内连接的驱动表来说,ON等效于WHERE。
标签:多表,记录,查询方法,扫描,查询,索引,单表,驱动,主键 来源: https://www.cnblogs.com/yuan-zhou/p/15599680.html