目录
·索引概述
无索引时:
索引:
·索引结构
介绍:
二叉树:
B-Tree(多路平衡查找树):
经典B+Tree
MySQL中B+树
Hash索引
hash索引的特点:
存储引擎支持:
为什么InnoDB存储选择使用B+Tree索引结构?
·索引分类
聚集索引选取规则:
展示:
执行过程:
·索引语法
·SQL性能分析
·索引使用
·索引设计原则
·索引概述
索引(index)是帮助MySQL高效获取数据的有序数据结构。
数据库系统中维护这满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,这样就可以在这些数据结构上实现高级查找算法快速查找数据,这种数据结构就是索引。
无索引时:
select * from user where age = 45;
它会把整张表都查找一遍,执行效率很低
索引:
它就像二分查找或者红黑树一样,会极大的增大我们的查询效率。
优缺点:
优点 | 缺点 |
提高数据检索的效率,降低数据库的IO成本 | 索引列也要占用空间(不怕,磁盘比较便宜) |
通过索隐裂对数据进行排序,降低数据排序的成本 | 索引大大提高了查询效率,但也降低了表的更新速度,对表进行INSERT,UPDATE,DELETE效率变慢(不会太多) |
·索引结构
介绍:
索引是在第三层存储引擎层实现的,所以存储引擎不同,索引的结构也不同。
索引结构 | 描述 |
B+Tree索引 | 最常见的索引,大部分引擎都支持B+树索引 |
Hash索引 | 底层数据结构通过哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询 |
R-tree(空间索引) | 空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少 |
Full-text(全文索引) | 是一种通过建立倒排索引,快速匹配文档的方式。 |
索引 | InnoDB | MyISAM | Memory |
B+tree索引 | 支持 | 支持 | 支持 |
Hash索引 | 不支持 | 不支持 | 支持 |
R-tree索引 | 不支持 | 支持 | 不支持 |
Full-text索引 | 5.6以后支持 | 支持 | 不支持 |
通常不说的话我们说的索引结构都是B+tree索引
二叉树:
二叉树是通过插入数据,然后和根节点比较,比根节点大放右边,比根节点小放左边。
二叉树的缺点:顺序插入时,会形成一个链表,查询性能大大降低。大数据量的情况下,层级越深,检索速度越慢。
B-Tree(多路平衡查找树):
以一颗最大度数为5的B-tree为例(每个节点最多存放4个key,5个value):
树的度数指的是一个节点的子节点个数
下面这个网站可以查看数据结构的变化:
B-Tree Visualization
当数据大于5个之后,中间元素会向上裂变。
经典B+Tree
以一颗最大度数为4的B+Tree为例:
1、所有的数都存储在叶子节点上,前面的都是索引
2、每一个节点都通过一个指针指向下一个节点,最终形成单向列表
B+ Tree Visualization
MySQL中B+树
MySQL索引数据结构对经典的B+Tree进行了优化,在原B+Tree的基础上,增加了一个指向相邻叶子节点的链表指针,形成了带顺序的指针B+Tree,提高了区间访问性能。
绿色的块是存放数据用的,里面存放的是这一行的数据,如6的下面绿色存放的就是索引为6的那一行的全部数据姓名,年龄,身高,性别等。。。
Hash索引
采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上。
如果发生hash冲突,可以通过链表解决
hash索引的特点:
1、Hash索引只能用于对等比较(=,in),不支持范围查找(between,>,<,...)
2、无法利用索引完成排序操作
3、查询效率高,通常只需要检索一次,效率要高于B+Tree索引
存储引擎支持:
在MySQL中,支持hash索引的是Memory引擎,而InnoDB中在某些情况下会自动把B+Tree构建成hash索引。
为什么InnoDB存储选择使用B+Tree索引结构?
1、相对二叉树,层级更少,搜索效率高。
2、相对B-Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键减少,指针跟着减少,要保存大量数据是,只能增加数的高度,导致性能降低。
3、相对Hash索引,B+Tree支持范围查找和排序。
·索引分类
分类 | 含义 | 特点 | 关键字 |
主键索引 | 针对表中主键创建的索引 | 默认自动创建,只能有一个 | PRIMARY |
唯一索引 | 避免表中某些数据列中的值重复(添加唯一约束的时候就是给它创建唯一索引) | 可以有多个 | UNIQUE |
常规索引 | 快速定位特定位置 | 可以有多个 | |
全文索引 | 全文索引是查找文本中的关键字,而不是比较索引中的值 | 可以有多个 | FULLTEXT |
在InnoDB中,根据存储形式,又可以分为以下两种
分类 | 含义 | 特点 |
聚集索引 | 将数据存储与索引放在了一起,索引结构的叶子节点保存了行数据 | 必须有,且只能有一个(主键) |
二级索引 | 将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键 | 可以存在多个 |
聚集索引选取规则:
如果存在主键,逐渐就是聚集索引
如果没有主键,则第一个唯一索引就是聚集索引
如果都没有,InnoDB会自动生成一个rowid作为隐藏的聚集索引
展示:
聚集索引下面存放的是一行的数据,而二级索引下面存放的是这个数据所在的id。
执行过程:
select * from user where name = 'Arm';
他会先根据Arm这个名字,在名字的二级索引里查找Arm,找到之后获得id,再根据id进行聚集索引,获得完成的数据。
这种线查找二级索引,再查找聚集索引的行为称之为回表查询。
---------------------------------------------------------------------------------------------------------------------------------
没写完呢,明天补,今天两篇拿个劵
---------------------------------------------------------------------------------------------------------------------------------