• mysql索引


    了解索引之前,首先想一下,为什么有索引?索引作用不是为了查询数据,而是为了快速的查询数据。那么索引是怎么实现快速的查询呢?这就必须要了解一些数据结构的问题。
    索引从概念上讲类似字典
    索引的数据结构:哈希表、有序数组、搜索树
    hash表=数组+链表 通过hash函数计算得出数组中的位置,如果hash出的值冲突,则在数组位置加挂链表
    二叉树:索引不止存在内存中,还要写入磁盘中。数据库在设计之初就将每个节点存储在一个的数据页中。因此当数据两超过百万时,2的10次方1024,2的20次方100多万。一次查询的数据可能存储在第20个数据页中。此处可以参考:MySQL索引背后的数据结构及算法原理
    因此为了减少数据查询的io次数,需要二叉树分出更多的枝杈以降低树的高度。这里就不得不了解B树与B+树的一些基本概念。B树与B+树
    mysql的底层数据结构是在存储引擎中实现的,本文以Inodb为例分析索引的原理和索引优化。
    这里假设我已经明白B+树的原理,那么索引如何优化呢?我们最开始想要的是提升查询的效率。B+树因为减少磁盘IO和避免多次递归,而提升了查询效率。
    既然通过数据结构已经提升了数据查询的效率了,那索引在其中有什么作用?
    回顾数据结构我发现,数据结构解决的是单个数据的快速查询。但我们查询数据是查的一堆数据。好的,现在答案就清晰了,索引就是数据结构里的那个数据。
    那么现在我们分析怎么才能让索引更好的服务数据结构,索引的设计与数据结构越匹配,查询越高效。
    首先说明一下索引的分类,在INoDB中索引按在数据结构中作用分为主键索引也称聚簇索引(主键索引的叶子节点连接的行数据)和其他索引(叶子节点连接的是主键值)。
    首先索引值如果可以排序那是最好不过了,这也是官方建议表使用自增主键的原因。
    索引设置的标准:
    索引覆盖:可以防止回表
    最左匹配:可以防止索引过多
    索引失效场景:索引字段上使用函数
    索引按照使用不同的可分为:联合索引,唯一索引,普通索引。
    唯一索引与普通索引的区别?
    结论:

    1. 在使用中,唯一索引不能有重复。主键索引可以重复。
    2. 查询效率,唯一索引与普通索引差别较小。
    3. 更新效率,普通索引避唯一索引效率要高。
      分析:数据的查询过程:①如果内存中存在,直接从内存中获取。②如果内存中没有,先从磁盘中读取到内存。
      数据更新过程:这里涉及到唯一索引和普通索引更新的不同。唯一索引需要保障数据的唯一性,因此在插入数据前需要读取数据。如果是普通索引,可以直接在change buffer中记录更新。这里唯一索引因为要进行读磁盘的io,所以效率降低。但如果恰好磁盘中有该数据的数据页,则仅仅多一次判断。
      ①如果内存中存在数据页,直接更新。
      ②如果内存中没有该数据的数据页,普通索引直接在change buffer中更新;唯一索引需要先将数据从磁盘中读取到内存中,再更新。
  • 相关阅读:
    MySQL进阶-sql执行时间的查询
    嵌入式知识总结:交叉编译、ARM汇编、驱动开发
    .net第二章数据类型、变量和常量
    探索在云原生环境中构建的大数据驱动的智能应用程序的成功案例,并分析它们的关键要素。
    Chapter 9 SVM实践
    yml配置动态数据源(数据库@DS)与引起(If you want an embedded database (H2, HSQL or Derby))类问题
    vue-cli创建
    Spring底层原理(二)
    北大青鸟昌平校区:自己的想法还需要他人左右吗?
    红蓝对抗 网络安全 网络安全红蓝对抗演练
  • 原文地址:https://blog.csdn.net/weixin_41492331/article/details/127758829