前言

索引是在数据库性能优化里挺重要的一环,下面会分几节来记录所学到索引的相关知识

索引是万能的吗?

SQL必知必会中看到一个关于索引的比喻感觉非常好:数据库中的索引,就好比一本书的目录,它可以帮我们快速进行特定值的定位与查找,从而加快数据查询的速率。
不过虽然是这么说,但是索引也不是万能的,不是在任何时候使用索引都合适。
比如:

  • 不到1000行的数据,不需要使用索引。
  • 当数据重复度高于10%也不需要(除了特殊情况:比如所需要查询的数据,有一部分极少)。

索引的种类

从功能逻辑来说,索引主要分为4种:

  • 普通索引:基础索引,没有任何约束,主要用于提高查询速率。
  • 唯一索引:在普通索引的基础上增加了唯一性的约束。
  • 主键索引:在唯一索引的基础上增加了不为空的约束。
  • 全文索引:MySQL自带的全文索引只支持英文,日常生产中大多使用全文搜索引擎 -> ElasticSearch(ES)

从物理逻辑来说,索引主要分为2种:

  • 聚集索引(又叫聚簇索引):按主键的顺序来排序存储数据,一般用在主键上,单查主键的时候效率非常高。
    结合前半部分的说明举个例子:
    聚集索引就好像要在一本字典中找一个字,如果知道了这个字的拼音,直接翻到相关页进行查询即可。
  • 非聚集索引(又叫非聚簇索引):在数据库系统中,会有额外的内存用来存储非聚集索引,并且这些索引是按照顺序存储的,单索引指向的内容是随机存储的。
    这里大概的意思是:非聚集索引,会通过索引字段先找到对应的主键值,再通过主键值获得行数据。换句话说就是系统会进行2次查找,一次找索引,一次找数据行。
    结合前半部分的说明举个例子:
    非聚集索引同样好像在一本字典中找一个字,但首先会在目录中根据想要的字的部首知道对应的字的页码,再根据页码找到对应的字。

聚集索引和非聚集索引在使用上也有区别:

  • 聚集索引的叶子节点存储的是数据,非聚集索引的叶子节点存储的是位置。
  • 一张表只能有一个聚集索引,但可以有多个非聚集索引。
  • 使用聚集索引的时候,数据查询效率高,但CUD等操作会比非聚集索引低。

学习参考来自课程《SQL必知必会》