/* */

MySQL索引

 

  索引是一种特殊的文件(InnoDB数据表上的索引是空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。通俗的讲,数据库索引好比是一本书的目录,能加快查询速度。在没有索引的情况下,数据库会按照顺序逐条遍历记录,知道查找到需要的数据为止,而有了索引,数据库就会直接在索引中查找符合条件的选项,直接在索引中定位需要的数据。

  InnoDB引擎会为每张表都加一个聚集索引,而聚集索引指向的的数据又是以物理磁盘顺序来存储的,自增的主键会把数据自动向后插入,避免了插入过程中的聚集索引排序问题。如果对聚集索引进行排序,这会带来磁盘IO性能损耗是非常大的。

聚集索引与非聚集索引

  以一本英语书为例。要找第8课,直接翻书,若先翻到第五课,则往后翻,在翻到第10课,则又往前翻。这本书本身就是一个索引,即“聚簇索引”。

  比方说:想要到字典上查找一个字,我们可以根据字典前面的拼音找到该字,注意拼音的排列时有顺序的。

 

  如果找“fire”这个单词,会先翻到书的附录,这个附录是按字母排序的,找到F字母那一块,再找到“fire”,对应的会是他在第几课。这个附录,为“非聚簇索引”。

  非聚集索引就像根据偏旁部首查字典一样,字典前面的目录在逻辑上也是连续的,但是查两个偏旁在目录上挨着的字时,字典中的字却很不可能是挨着的。

聚集索引

  InnoDB将通过主键聚集数据,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。

  这部分是我们不能选择的,聚簇索引可以说是一种索引,也可以说是一种数据存储方式。它的索引号和对应的记录是存在一起的。存储数据的顺序和索引顺序一致。

  索引中键值的逻辑顺序决定了表中相应行的物理顺序(索引中的数据物理存放地址和索引的顺序是一致的),可以这么理解:只要是索引是连续的,那么数据在存储介质上的存储位置也是连续的。

  优势:当主键为自增时,做按主键的范围查询。

  缺点:通常按主键,主键如果是uuid,无法保证顺序。做范围条件查询时,开销很大。

非聚集索引

  非聚集索引的叶子节点仍然是索引节点,只有又指向对应数据块的指针。

  索引的逻辑顺序与磁盘上的物理存储顺序不同。非聚集索引的键值在逻辑上也是连续的,但是表中的数据在存储介质上的物理顺序是不一致的,即记录的逻辑顺序和实际存储的物理顺序没有任何联系。索引的记录节点有一个数据指针指向真正的数据存储位置。

  就是书的目录。

  一张表可以最多建249个非聚簇索引,建索引需要额外的内存。索引不是越多越好。每次往表里插入数据时,要同步更新索引。所以建索引时要慎重考虑。

索引的数据结构分类
B+TREE
  • 普通索引

  • 唯一性索引:普通索引 + 字段取值必须唯一

  • 主键自带索引

  • 联合索引(多列)

    索引用的数据结构是 B+TREE,B是balance,称为平衡树,是二叉树基础上衍生出的结构。

    https://visualgo.net/zh/bst

HASH索引

    很快、占内存、不适合做范围查找。

    https://visualgo.net/zh/hashtable

其他

R-TREE:针对几何图形的。

posted @ 2020-08-31 23:44  瓶子*  阅读(82)  评论(0编辑  收藏  举报
/* 看板娘 */