索引概念+类型+优缺点+数据结构+两种存储引擎

1、索引的理解:

索引是帮助mysql高效获取数据的数据结构,如果把数据库中的表比作一本书,索引就是这本书的目录,通过目录可以快速查找到书中指定内容的位置。
一般来说,索引本身也很大,不可能全部存入内存中,因此索引往往是存储在磁盘上的文件中

2、优点:

a)可以保证数据库表中每一行的数据的唯一性。
b)可以大大加快数据的检索效率
c)加速表与表之间的连接,特别是在实现数据的参考完事性方面特别有意义。
d)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
f)通过使用索引对数据进行排序,降低数据排序的成本,降低cpu的消耗,可以在时间查询的过程中,使用优化隐藏器,提高系统的性能。

3、缺点:

a) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
b) 索引会占据磁盘空间。
c) 以表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度。

4、建立索引的原则:

e) 在经常需要搜索的列上,可以加快搜索的速度。
f) 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构。

5、索引的类型:

1、 主键索引: 索引列中的值是唯一的并且不允许有空值
2、 普通索引:mysql的基本索引类型,没有什么限制,允许有重复值和空值
3、 唯一索引: 索引列中的值是唯一的,但是允许有空值
4、 全文索引: 只有在文本类型char varchar text类型字段上创建全文索引。如果字段长度比较大,创建普通索引,进行like模糊查询效率会比较低,这样可以创建全文索引
5、 空间索引: 支持openGIS几何数据模型规则
6、 前缀索引: 在文本类型char varchar text类型上创建索引,可以指定索引的长度,但是数值类型就不能指定

6、索引的数据结构:

1)、 hash表

以键值对的方式存储数据,我们使用hash表中的key可以存储索引列,value可以存储行记录或者行磁盘地址,hash表的查询效率高,时间复杂度为o(1),但是不支持范围查找,范围查找的话还是得扫描全表

2)、树

二叉树:
虽然每次查找都会这般,但如果“树不分叉了”,这就很不稳定
平衡二叉树:
采用二分法思想,平衡二叉树的特征是树的左右两个子树差的等级最多差1,时间复杂度可以达到o(log2n),但是时间复杂度和树高有关,树有多高就会检索多少次,在数据量大的时候,新跟那个也就会很差,第二点就是不支持范围查询快速查找
B树:
在每个点存储多个元素,每个节点呢尽量多存储数据,这样就将二叉树变为多叉树,查询的效率也提高了。但是:b树不支持范围查询的快速查找第二个缺点是,如果data存储的是行记录,行的大小随着列数的增多空间变大,一个页中存储的数据量就会编写,树就会变高

B+树:
b树的非叶子节点和叶子节点都会存储数据
b+树只有叶子节点才会存储数据,非叶子节点存储键值。夜之子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表
b+树可以保证等值和范围查询的快速查找,mysql就采用了b+树的数据结构

7、mysql两种存储引擎的索引实现:

1)、 MyISAM索引

数据文件和索引文件分开存储,使用b+树构建索引树时,叶子节点存储的键值为索引列的值,数据为索引所在行的磁盘地址

2)、 InnoDB索引

每个InnoDB表都有一个聚簇索引,使用b+tree构建,叶子节点存储的数据时整行记录,一般情况下,聚簇索引等同于主键索引,如果一个表没有创建主键索引,InnoDB会自动创建rowid字段构建聚簇索引(查询的时候直接获取整行数据,返回给客户端)
辅助索引:除聚簇索引之外的所有索引都称为辅助索引,InnoDB的辅助索引只会存储主键值而不是磁盘地址,使用辅助索引要检索两边索引:先找到主键,然后使用主键去主索引获得需要的记录
组合索引:联合索引(a,b,c)
b+tre会先比较a列来确定下一步搜索方向向左还是右,如果a列相同再比较b列,如果没有查询到a,b+tree就不知道从哪里查起
组合索引的最左前缀匹配原则:使用组合索引查询时,mysql会一直向右匹配直至遇到范围查询(>、<、between、like)就停止匹配
覆盖索引:并不是索引结构,是一种优化手段,使用辅助索引的时候,就会经过两次获得数据,但如果再组合索引下查询,我们查询到叶子节点就可以直接返回,不需要回标,这就是覆盖索引
适合使用联合索引:
1、 把频繁使用的列,区分度高的列放在前面
2、 也可以把常需要作为查询返回的字段增加到联合索引
联合索引的使用不仅可以节省空间,还可以更容易的使用到索引覆盖

猜你喜欢

转载自blog.csdn.net/weixin_44697051/article/details/119716867
今日推荐