一、索引例子分析
1、select * from T where k between 3 and 5
执行几次搜索树?会扫描多少行?
> create table T(
ID int primary key,
k int NOT NULL DEFAULT 0,
s varchar(16) NOT NULL DEFAULT '',
index k(k)) engiine
> insert into T values(100, 1, 'aa'),(101, 2, 'ab'),(102, 3, 'ac'),(103, 4, 'ad'),(104, 5 'ad'),(105, 7, 'ad')
2、执行流程
- 在 k 索引树上找到 k=3 的记录,取得 ID = 102;
- 再到 ID 索引树查到 ID=102 对应的 数据;
- 在 k 索引树取下一个值 k=5,取得 ID=104;
- 再回到 ID 索引树查到 ID=104 对应的 数据;
- 在 k 索引树取下一个值 k=6,不满足条件,循环结束。
回表:回到主键索引树搜索的过程
二、覆盖索引
1、Select ID from T where k between 3 and 5
- 需要查 ID 的值, 而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表。
- 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的
性能优化手段。
三、联合索引
1、有一个高频请求,要根据市民的身份证号查询他的姓名则么做?
建立一个(身份证号、姓名)的联合索引
2、索引字段的维护是有代价的,在建立冗余索引来支持覆盖索引时就需要权衡考虑。
四、、联合索引 最左前缀原则
1、B+ 树索引结构,可以利用索引的“最左前缀”,来定位记录。
2、在建立联合索引的时候,如何安排 索引内的字段顺序。
- 第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序是需要优先考虑采用的。索引的复用能力
- 第二原则 考虑索引的空间使用
3、例子 一建立了一个联合索引 (a,b)
查询既有联合查询,又有基于a、b各自的查询,无法使用(a,b)这个联合索引。这时就需要维护单个索引。
五、、联合索引 索引下推
1、MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
2、例子 检索出表中“名 字第一个字是张,而且年龄是 10 岁的所有男孩” 联合索引是(name,age)
- 语句
> select * from tuser where name like '张%' and age 10 and sex = 1
ID | name | sex | age |
---|---|---|---|
1 | 张1 | 1 | 30 |
2 | 张2 | 1 | 10 |
3 | 张3 | 0 | 20 |
4 | 张4 | 0 | 10 |
- InnoDB 在 (name,age)索引内部就判断了age是否等于10,对于不等于10的记录,直接判断并跳过。减少了回表的次数。上表只需两次回表 内部判断会丢弃年龄为 30 和 20 的