关于MySql数据库索引的总结

关于MySql很多知识都遗忘了,面试的时候还是问到一些内容,所以也要系统的整理一下了,说实话数据库这边一开始就学的不太行,趁着复习好好学一下,对底层的理解,实际应用的情况,才是要学习的重点。

 

先从提问最多的索引开始:

索引就是数据库表中一列或多列的值进行排序的一种结构,使用索引可以快速访问数据库表中某一特定信息。

 

索引本质就是数据结构,索引的一个主要目的就是加快检索表中数据的方法,也能协助信息搜索者尽快找到符合限制条件的记录ID的辅助数据结构。

 

索引的优点

  1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;
  2. 可以大大加快数据的检索速度,这也是创建索引的最主要原因;
  3. 使用分组和排序子句进行数据检索的时候,同样可以显著减少查询中分组和排序的时间;
  4. 可以加速表与表之间的连接,特别是在实现数据的参考完整性方面特别有意义;
  5. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能;

 

缺点

  1. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加;
  2. 索引需要占用物理空间,除了数据表和数据空间之外,创建一个索引还需要一定的物理空间,如果创建一个聚簇索引,所需的空间就会更大;
  3. 当对表进行增加,修改和删除等操作时,对索引也需要动态的维护

 

说道这里,我们就可以知道:

  1. 添加索引不一定就是好的;
  2. 就算添加了索引也不一定会提高查询性能;
  3. 添加了索引也不一定使用索引。

 

具体是为什么呢?

首先添加了索引,相当于自动填加了一些“数据”,虽然这些数据有助于我们更快找到其他有用的数据,但是添加的多了,占用的空间也就多了。

这里要说明一下数据库的DB在执行一条Sql语句时,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件就加入搜索的集合中。而我们对某一字段加入索引之后,查询时就会先去索引列表中一次定位到特定值的行数,大大减少了遍历的行数,明显增加速度,而这后面有一个叫做查询优化器的东西进行分辨,索引和默认遍历那种更好,查询优化器就会选择哪个。

所以如果我们添加的索引多了,到达一定数量了,查询优化器就“木乱”了,反而降低了查询的速度。

 

所以总而言之,索引虽好,但不要贪用哦。

 

那我们稍微总结一下索引的使用原则:

  1. 很少查询或者参考的列不应该创建索引
  2. 数据很少的列不应该添加索引
  3. 定义为next、image和bit的数据类型不应该加索引,因为这些列的数据量要么相当大,要么取值很少(没有使用过这些数据类型,也不是很理解,所以还是多实践才能出真理)
  4. 修改的次数较多时,不应该使用索引

 

综上,数据量多并且经常查询的数据列,添加索引就完事了。

 

索引的分类

在MySql数据库中,索引分为:唯一索引,聚簇索引(主键索引),普通索引,全文索引

唯一索引:不允许具有索引值相同的行,所以使得该行数据是唯一索引,在创建的时候系统就会检查是否有重复的键值,每次inset和update时也会进行检查。

聚簇索引:是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致,且一个表只能有一个聚簇索引,因为物理存储只能有一个顺序。主键索引一般都是聚簇索引。

普通索引:表数据存储顺序与索引顺序无关。叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。(有点高深,不太理解)

普通索引(非聚簇索引)记录的物理顺序与逻辑顺序没有必然的联系,与数据的存储物理结构没有关系;一个表对应的非聚簇索引可以有多条,根据不同列的约束可以建立不同要求的非聚簇索引;

全文索引:是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。

 

最后让我们谈谈索引的底层实现:

我目前知道的,就是使用hash索引B+Tree索引,但相比较来说B+Tree索引更好一点。

因为Hash底层是一张Hash表,Hash表中多个储存元素之间没有任何顺序关系,所以Hash索引只能使用于等值查询,而无法使用于区间查询,否则就得全表扫描。

而B+Tree属于多路平衡搜索树,各个叶节点之间都是有序的,(左孩子节点<父节点,父节点<右孩子节点),所以再进行区间范围查询的时候不必进行全表扫描。

 

关于底层实现其实还没有吃的很透,因为对B+Tree还没有很理解,但大概使用类别是搞清楚了,然后多多使用才能体会其中的奥妙之所在!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值