索引下推
注意:如果学过关系代数语法树优化的,一看就懂。想学好数据库还是要回到课本
现在假设有张用户表
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| id | int |
| age | int |
| FirstName | varchar |
| LastName | varchar |
+-------------+---------+
建立联合索引
create index idx_firstName_age on users(firstName,age)
现在查询 firstName 开头带有t的,并且年纪等于20岁的记录
select firstName,lastName,age from users where firstName like 't%' and age = 20
物理存储
现在插入五条数据
insert into users (id,fristName,lastName,age) values (001,'Tome','ajad',20);
insert into users (id,fristName,lastName,age) values (002,'Jack','ajad',18);
insert into users (id,fristName,lastName,age) values (003,'Tome','ajad',18);
insert into users (id,fristName,lastName,age) values (004,'Lee' ,'ajad',17);
insert into users (id,fristName,lastName,age) values (005,'Lee' ,'ajad',19);
结构简单描述如下
上面二级索引少画了主键的物理地址
语法分析树
所有的sql语句最后都会转换成关系代数去执行。语法树是从下往上开始执行的
使用apply 表示从索引回表的操作,这里我是为方便表示,事实上并没有这种表示方法
首先去联合索引(idx_firstName_age)去查找 firstName t开头的所有记录,然后回表返回 firstName lastName age 记录,再根据返回的记录找到 age = 20 的记录。
索引下推
index condition pushdown
很多不懂为啥叫索引下推?
首先是索引,其实就是选择条件下推,在《数据库系统概论 第五版》中,对于关系代数优化,尽可能得把选择和投影下移
从下图就知道了,选择条件下移,在联合索引里面判断,通过减少回表的次数,达到优化得目的