目录
1. 什么是索引
索引是一个单独被存储在磁盘上的数据库结构,包含着对数据库表里面所有数据的引用指针,使用索引可以快速定位到数据库中的数据。
2. 为什么要使用索引
因为在查询表数据时,索引可以避免全表扫描,减少IO访问次数,提高查询效率
3. mysql使用B+树做索引的优点
Hash:虽然通过hash值查询快,但是hash无序,无法进行范围查找
平衡二叉树:左右子树的高度绝对值只差不会大于1,树越高查询越慢,范围查找有回旋查找问题
B树:一个节点可以存两个值,树的高度变矮了,查询较快,但是范围查找仍然有回旋查找的问题
B+树:
非叶子节点只存key(具体数字),非叶子节点既存key,有存value(数据的地址)
一个节点可以存两个值,树的高度比较矮
有一个单向有序链表作为叶子节点,解决了回旋查找的问题(使用索引排序的原因)
4. 聚簇索引(InnoDB)
将数据存储和索引放在一起,索引的叶子节点保存了行数据
表数据按照索引的顺序来存储的,也就是说索引项的顺序和表中记录的物理顺序一致
InnoDB中,在聚簇索引之上建立的索引称之为辅助索引,像唯一索引、符合索引、单值索引
①聚簇索引默认是主键
②如果表中没有定义主键,InnoDB会选择一个唯一非空索引代替
InnoDB索引分两种,聚簇索引(如主键索引)和辅助索引(单值索引);
聚簇索引查询出结果后,叶子节点会存储整行完整的数据;
辅助索引智慧查询出索引值和主键key值,还需要再通过主键值回表查询出整行完整数据
5. 非聚簇索引(MyIsam)
将数据和索引分来存储,表数据顺序和索引顺序无关
6. 解决回表查询的方法
通过建立联合索引实现覆盖索引,可避免回表查询
什么是覆盖索引?
如果 select 后面查询的字段都可以从这个索引的树中获取,这种情况一般可以说是用到了覆盖索引;覆盖索引一般针对的是辅助索引,整个査询结果只通过辅助索引就能拿到结果,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值。
如何实现索引覆盖?
最常见的方法就是:将被查询的字段,建立到联合索引(如果只有一个字段,普通索引也可以)里去;如以下这句sql,我在name字段建立了一个索引
SELECT id,name FROM student
原因:因为索引叶子节点存储了主键id,而name也是索引,所以查询为覆盖索引,无需回表查询
当添加一个不是索引的字段时,那么就无法从索引树上查询,必须回表查询出这个字段
SELECT id,name,age FROM student
原因:先在辅助索引树中查询出id(id和name),再通过主键id在聚簇索引树中查询整行数据,从而查询出age,此时可建立联合索引(name, age)解决回表查询的问题
7. 聚簇索引和非聚簇索引数据结构


文章详细介绍了数据库索引的概念,强调了使用索引提高查询效率的原因。重点讨论了MySQL中B+树作为索引结构的优势,包括其解决回旋查找问题的能力。接着,对比了InnoDB的聚簇索引(主键索引)和MyIsam的非聚簇索引,解释了回表查询的现象以及如何通过创建覆盖索引来优化查询性能。
1579

被折叠的 条评论
为什么被折叠?



