MySQL索引
索引是一种特殊的文件(InnoDB数据表上的索引是空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。通俗的讲,数据库索引好比是一本书的目录,能加快查询速度。在没有索引的情况下,数据库会按照顺序逐条遍历记录,知道查找到需要的数据为止,而有了索引,数据库就会直接在索引中查找符合条件的选项,直接在索引中定位需要的数据。
InnoDB引擎会为每张表都加一个聚集索引,而聚集索引指向的的数据又是以物理磁盘顺序来存储的,自增的主键会把数据自动向后插入,避免了插入过程中的聚集索引排序问题。如果对聚集索引进行排序,这会带来磁盘IO性能损耗是非常大的。
聚集索引与非聚集索引
如果找“fire”这个单词,会先翻到书的附录,这个附录是按字母排序的,找到F字母那一块,再找到“fire”,对应的会是他在第几课。这个附录,为“非聚簇索引”。
非聚集索引就像根据偏旁部首查字典一样,字典前面的目录在逻辑上也是连续的,但是查两个偏旁在目录上挨着的字时,字典中的字却很不可能是挨着的。
聚集索引
InnoDB将通过主键聚集数据,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。
这部分是我们不能选择的,聚簇索引可以说是一种索引,也可以说是一种数据存储方式。它的索引号和对应的记录是存在一起的。存储数据的顺序和索引顺序一致。
索引中键值的逻辑顺序决定了表中相应行的物理顺序(索引中的数据物理存放地址和索引的顺序是一致的),可以这么理解:只要是索引是连续的,那么数据在存储介质上的存储位置也是连续的。
优势:当主键为自增时,做按主键的范围查询。
缺点:通常按主键,主键如果是uuid,无法保证顺序。做范围条件查询时,开销很大。
非聚集索引
非聚集索引的叶子节点仍然是索引节点,只有又指向对应数据块的指针。
索引的逻辑顺序与磁盘上的物理存储顺序不同。非聚集索引的键值在逻辑上也是连续的,但是表中的数据在存储介质上的物理顺序是不一致的,即记录的逻辑顺序和实际存储的物理顺序没有任何联系。索引的记录节点有一个数据指针指向真正的数据存储位置。
就是书的目录。
一张表可以最多建249个非聚簇索引,建索引需要额外的内存。索引不是越多越好。每次往表里插入数据时,要同步更新索引。所以建索引时要慎重考虑。
索引的数据结构分类
B+TREE
-
普通索引
-
唯一性索引:普通索引 + 字段取值必须唯一
-
主键自带索引
-
联合索引(多列)
索引用的数据结构是 B+TREE,B是balance,称为平衡树,是二叉树基础上衍生出的结构。
HASH索引
很快、占内存、不适合做范围查找。
https://visualgo.net/zh/hashtable
其他
R-TREE:针对几何图形的。