芮城做网站的机构,数据库内容进 wordpress,小程序游戏定制开发,微软做网页的软件深入浅出索引
索引的出现其实就是为了提高数据查询的效率#xff0c;就像书的目录一样。
索引的常见模型
哈希表
哈希表是一种以键 - 值#xff08;key-value#xff09;存储数据的结构#xff0c;我们只要输入待查找的值即 key#xff0c;就可以找到其对应的值即 Val…深入浅出索引
索引的出现其实就是为了提高数据查询的效率就像书的目录一样。
索引的常见模型
哈希表
哈希表是一种以键 - 值key-value存储数据的结构我们只要输入待查找的值即 key就可以找到其对应的值即 Value。哈希的思路很简单把值放在数组里用一个哈希函数把 key 换算成一个确定的位置然后把 value 放在数组的这个位置。不可避免地多个 key 值经过哈希函数的换算会出现同一个值的情况。处理这种情况的一种方法是拉出一个链表。 哈希表这种结构适用于只有等值查询的场景比如 Memcached 及其他一些 NoSQL 引擎。
有序数组
有序数组在等值查询和范围查询场景中的性能就都非常优秀。 有序数组索引只适用于静态存储引擎。
二叉搜索树
二叉搜索树的特点是每个节点的左儿子小于父节点父节点又小于右儿子。 为了维持 O(log(N)) 的查询复杂度你就需要保持这棵树是平衡二叉树。为了做这个保证更新的时间复杂度也是 O(log(N))。树可以有二叉也可以有多叉。多叉树就是每个节点有多个儿子儿子之间的大小保证从左到右递增。二叉树是搜索效率最高的但是实际上大多数的数据库存储却并不使用二叉树。其原因是索引不止存在内存中还要写到磁盘上。N 叉树由于在读写上的性能优点以及适配磁盘的访问模式已经被广泛应用在数据库引擎中了。
InnoDB 的索引模型
InnoDB 使用了 B 树索引模型所以数据都是存储在 B 树中的。每一个索引在 InnoDB 里面对应一棵 B 树。根据叶子节点的内容索引类型分为主键索引和非主键索引。 主键索引的叶子节点存的是整行数据。在 InnoDB 里主键索引也被称为聚簇索引clustered index。非主键索引的叶子节点内容是主键的值。在 InnoDB 里非主键索引也被称为二级索引secondary index。基于非主键索引的查询需要多扫描一棵索引树即回表。因此我们在应用中应该尽量使用主键查询。 自增主键的插入数据模式符合递增插入的场景。 每次插入一条新记录都是追加操作都不涉及到挪动其他记录也不会触发叶子节点的分裂。而有业务逻辑的字段做主键则往往不容易保证有序插入这样写数据成本相对较高。主键长度越小普通索引的叶子节点就越小普通索引占用的空间也就越小。 覆盖索引 由于覆盖索引可以减少树的搜索次数显著提升查询性能所以使用覆盖索引是一个常用的性能优化手段。 最左前缀原则 B 树这种索引结构可以利用索引的“最左前缀”来定位记录。不只是索引的全部定义只要满足最左前缀就可以利用索引来加速检索。这个最左前缀可以是联合索引的最左 N 个字段也可以是字符串索引的最左 M 个字符。 在建立联合索引的时候如何安排索引内的字段顺序 第一原则是如果通过调整顺序可以少维护一个索引那么这个顺序往往就是需要优先考虑采用的。 索引下推 索引下推优化index condition pushdown) 可以在索引遍历过程中对索引中包含的字段先做判断直接过滤掉不满足条件的记录减少回表次数。在满足语句需求的情况下 尽量少地访问资源是数据库设计的重要原则之一。我们在使用数据库的时候尤其是在设计表结构时也要以减少资源消耗作为目标。