提出的问题什么时候创建索引,什么时候不使用索引?索引有哪些类型?什么是索引?索引是一种帮助数据库管理系统高效获取数据的数据结构。它就像一本书的目录。它可以帮助我们快速定位和搜索特定的值,从而加快数据查询的效率。索引的类型按功能逻辑划分。普通索引是没有任何约束的基本索引。它们主要用于提高查询效率。唯一索引在普通索引的基础上增加了数据唯一性约束。在一个数据表中,可以有多个唯一索引,主键索引在唯一索引的基础上增加了一个非空约束,即NOTNULL+UNIQUE。一张表中至多有一个主键索引。全文索引用的不多。MySQL自带的全文索引只支持英文。从聚集索引的物理实现上,我们通常可以使用专门的全文搜索引擎,如ES(ElasticSearch)和Solr。聚集索引可以根据主键对数据进行排序和存储,这在查找行时非常有效。非聚集索引在数据库系统中会有一个单独的存储空间存放非聚集索引。这些索引项是顺序存储的,但是索引项指向的内容是随机存储的。也就是说,系统会进行两次搜索。第一次找到索引,第二次找到索引对应的位置,取出数据行。它维护一个单独的索引表(只维护索引,不维护索引指向的数据。不同的是聚簇索引,非聚簇索引的叶子节点存放的是我们的数据记录,非聚簇索引的叶子节点索引存储数据位置,非聚集索引不影响数据表的物理存储顺序,一张表只能有一个聚集索引,因为只能有一种排序存储方式,但可以有多种非聚簇索引,即多个索引目录提供数据检索,当使用聚簇索引时,数据的查询效率高,但如果对数据进行插入、删除、更新等操作,效率原则索引低于非聚集索引,为什么要将索引存储在硬盘上呢?数据库服务器有硬盘和内存两种存储介质,如果存储在内存中出现故障,如一个断点,很容易造成数据丢失并将其存储在磁盘上,会有很多IO。我们知道磁盘IO是耗时的。如果索引数据结构尽可能减少磁盘IO操作,那么耗时会大大减少。从二叉树到B+树支持快速搜索的数据结构有跳表、哈希表、二叉树搜索树。跳表支持区间搜索,哈希表不支持区间查询,二叉树搜索树不支持区间快速查询。但是,二叉树搜索树的不断进化和改造,满足了索引对数据结构的要求,我们来看看从二叉搜索到B+树的进化过程。二叉搜索树是一种比较大的二叉树。每个节点的左子节点小于父节点,右子节点大于父节点。找地的时间复杂度是O(log2n)。iShot2020-03-0522.55.45.png但是随着节点不断的加入到树中,可能会造成某条路径会不断增加,最终二叉树退化为链表的现象,而时间复杂度变为O(n)。如果能保持左右子树的高度差相同,保持二叉搜索树的特性,大牛们提出了一种平衡二叉树的结构,允许左右子树的高度差每个结点的右子树不超过1个,就是严格平衡的,比如avl树,但是对于这种严格平衡的树,高度差的维持需要设计复杂的算法来实现,时间成本会也增加。高度差不宜过大。虽然查询速度会损失一点,但是树的复杂度大大降低,查询效率可以满足要求。这种树称为红黑树。数据查询的时间主要取决于磁盘I/O的数量。如果我们使用二叉树的形式,即使通过平衡二叉搜索树来改进,树的深度也是O(log2n)。当n比较大时,深度就比较高。这时候大牛又来了,应该是多叉树吧。可以降低多叉树的高度,从而减少磁盘IO次数。给这棵树起个名字,叫多叉平衡树,BalanceTree。应该有多少个叉子?这是根据内存页的大小计算的。平衡树也是一种B树。B树的节点可以存储数据,会导致查询效率不稳定。有的时候访问非叶子节点就能找到关键词,有的时候需要访问叶子节点才能找到。关键字。这时,B+树又被提出来了。B+树的非叶子节点只存放索引不存放数据,叶子节点存放数据记录。叶节点组成一个双向链表,从大到小依次链接。欢迎到我的博客看看,还有更多实测内容!!
