mysql数据库索引原理及使用注意事项

索引原理

索引出现的原因

在使用关系型数据库的时候,我们常常听到一个词:“索引”,在优化数据库的时候,我们常常听到有人提到添加索引可以加快数据库的查询速度,今天我们就来谈一谈它的原理。

关系型数据库之所以叫这个名字,是因为它采用了一种名为“关系”的数据结构来存储数据,说简单点就是二维表格,就像我们使用navicat或者其它mysql可视化工具看到的表一样,这样的数据结构称为“关系”。

采用这样的数据结构好处就是逻辑显而易见,计算机中存储的数据结构基本上就是要呈现给用户来看的结构。但是这样的缺点就是查询的时候速度不太快,当然这个不太快是相对于一些其它的数据结构来说的。

例如,我们想象一下,我们现在在一个巨大的图书馆中,书本全是杂乱摆放的,并没有做任何的分类,现在我们只知道其中一本书的信息,如果想要找到这样一本书,无异于大海捞针。因此,为了我们查询的快速方便,我们引入了“索引”的概念。

索引分类

索引从大体上分为两类,第一类是聚集索引,第二类是非聚集索引,看到这里你可能就迷惑了,“为什么我看到的索引有好几种,比如什么普通索引,全文索引,唯一索引?”没错,这些都是索引,但是这些索引统统属于非聚集索引,也就是我们平时所加的索引,那么聚集索引是什么呢?

聚集索引

听着神秘,其实聚集索引对我们来说再熟悉不过了,它就是我们常常设置的数据库主键。试想以下场景:你在第一次学习建立一个数据库的时候有疑问,这个主键是什么?你查了很多网页,通通只是说主键是唯一值,数据库根据主键排序之类巴拉巴拉的话,但是你并不知道主键的本质就是索引。

当你设置了主键,你就为图书馆中的每一本书设置了书号,并且书号对应的书放在什么位置你都一清二楚了,于是,现在你要是想找到一本书只要简简单单地去对应的位置拿书就可以了。这是一种比喻,那么实际上在我们的数据库中,主键是如何实现的呢?

当我们给一个表设置了一个主键,此时的这张表实际上已经不是一张表了,而是变成了树形结构(或哈希桶,非主流),而且还是平衡树。如果对平衡树不了解的可以去看看这篇博客实现一个平衡二叉树:https://blog.csdn.net/qq_37856300/article/details/83927795
当然,表变成的是平衡多叉树而不是二叉树,树的每个节点的值都是主键的值,比如设置的id是主键,那么节点的值就是id,举个例子:
现在有这样几个表记录:
在这里插入图片描述
当我们设置主键之前,数据库中的结构就是如图这样:
在这里插入图片描述
现在这就是我们的数据存储区的模样

但是一旦我们设置了id,就会变成下图这样:
在这里插入图片描述
下面的存储数据区依然不变,不过上面树形结构的部分就是我们的主键,聚集索引部分了,可以看到,节点中存储的都是主键id的值

有了这样的结构,我们再去查询并取出数据就要快的多了,即使是上亿条数据,也只需要查询比较十几次就够了

非聚集索引

有了聚集索引,那么为什么会有非聚集索引呢,解释很简单,刚刚我们有了书号,直接使用聚集索引可以直接找到书,现在如果我们没有了书号,只有书的一些条件,想要根据条件找出书本,难道只能像没有聚集索引的时候一样大海捞针地去寻找吗?

不是,我们有非聚集索引。非聚集索引是通过给字段建立索引能够快速地找到符合字段条件的主键值,然后拿着主键值再去聚集索引中找到主键值对应的记录,也就是说,流程是这样的:
非聚集索引查询->拿到主键值->聚集索引使用主键值查询->拿到记录

使用索引的优缺点及注意事项

这里的优缺点仅仅讨论非聚集索引,因为聚集索引基本上是非加不可的,所以没有讨论的必要。

非聚集索引的优点当然就是快了,查询的速度真的是增长了好多好多倍,缺点有两个,第一是生成索引会占据空间,第二个是减慢了增删改的速度。

第一个其实无所谓,因为外存的成本比较低,所以花费一些空间来让查询速度提升完全是值得的。第二点就比较麻烦了,因为在增删改的同时还要保证索引树的平衡,所以做了很多平衡操作,因此拖慢了速度,这就要求我们人为控制了,尽管查操作是在数据库中使用最频繁的操作,但是我们也不能滥用索引,对那些频繁查找的字段,我们确实最好加上索引,但是对那些经常增删改的字段,我们在加索引的时候还是谨慎为好。

使用注意:
  1. 使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。
  2. 非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。
  3. 不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好。
  4. 对于查询频率高的字段创建索引;
  5. 对排序、分组、联合查询频率高的字段创建索引;
  6. 对排序、分组、联合查询频率高的字段创建索引;
  7. 索引的数目不宜太多 索引的数目不宜太多
  8. 需要将多个列设置索引时,可以采用多列索引
  9. 选择唯一性索引
  10. 尽量使用数据量小的索引
  11. 尽量使用前缀来索引
    如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。
  12. 删除不再使用或者很少使用的索引.

猜你喜欢

转载自blog.csdn.net/qq_37856300/article/details/85424506
今日推荐