首页 > 其他分享 >索引原理与优化

索引原理与优化

时间:2023-03-14 14:22:26浏览次数:33  
标签:前缀 扫描 Tree 查询 索引 原理 优化 节点

下面这条 SQL,你怎么通过索引来提高查询效率呢?

select * from order where status = 1 order by create_time asc

更优的方式是建立一个 status 和 create_time 组合索引,这是为了避免 MySQL 数据库发生文件排序。因为在查询时,你只能用到 status 的索引,但如果要对 create_time 排序,就要用文件排序 filesort,也就是在 SQL 执行计划中,Extra 列会出现 Using filesort。

利用索引的有序性,在 status 和 create_time 列建立联合索引,这样根据 status 筛选后的数据就是按照 create_time 排好序的,避免在文件排序。

 

InnoDB 是 MySQL 建表时默认的存储引擎,B+Tree 索引类型也是 MySQL 存储引擎采用最多的索引类型。

 

 

  B+Tree 相比于 B 树和二叉树来说,最大的优势在于查询效率。

  • 通过非主键(辅助索引)查询商品数据的过程

会先检索辅助索引中的 B+Tree 的 商品编码,找到对应的叶子节点,获取主键值,然后再通过主键索引中的 B+Tree 树查询到对应的叶子节点,然后获取整行数据。这个过程叫回表。

B+Tree 索引的优势

  • B+Tree 相对于 B 树 索引结构的优势

B+Tree 只在叶子节点存储数据,而 B 树 的非叶子节点也要存储数据,所以 B+Tree 的单个节点的数据量更小,在相同的磁盘 I/O 次数下,就能查询更多的节点。

B+Tree 叶子节点采用的是双链表连接,适合 MySQL 中常见的基于范围的顺序查找

  • B+Tree 相对于二叉树索引结构的优势

对于有 N 个叶子节点的 B+Tree,其搜索复杂度为O(logdN),其中 d 表示节点允许的最大子节点个数为 d 个。在实际的应用当中, d 值是大于100的,这样就保证了,即使数据达到千万级别时,B+Tree 的高度依然维持在 3~4 层左右,也就是说一次数据查询操作只需要做 3~4 次的磁盘 I/O 操作就能查询到目标数据

  • B+Tree 相对于 Hash 表存储结构的优势

Hash 表不适合做范围查询

通过执行计划查看索引使用详情

 

  possible_keys 字段表示可能用到的索引,key 字段表示实际用的索引,key_len 表示索引的长度,rows 表示扫描的数据行数。

重点关注 type 字段

  • ALL(全表扫描);

  • index(全索引扫描);

  • range(索引范围扫描);

  • ref(非唯一索引扫描);

  • eq_ref(唯一索引扫描);

  • const(结果只有一条的主键或唯一索引扫描)。

索引失效的常见情况

  • 索引列上做了计算、函数、类型转换操作,这些情况下索引失效是因为查询过程需要扫描整个索引并回表,代价高于直接全表扫描;

  • like 匹配使用了前缀匹配符 '%abc';

  • 字符串不加引号导致类型转换

常见优化索引的方法

  • 前缀索引优化,在一些大字符串的字段作为索引时,使用前缀索引可以帮助我们减小索引项的大小。前缀索引有一定的局限性,例如 order by 就无法使用前缀索引,无法把前缀索引用作覆盖索引。

  • 覆盖索引优化,覆盖索引是指 SQL 中 query 的所有字段,在索引 B+tree 的叶子节点上都能找得到的那些索引,从辅助索引中查询得到记录,而不需要通过聚簇索引查询获得。

  • 联合索引 联合索引时的字段顺序,对索引效率也有很大影响。越靠前的字段被用于索引过滤的概率越高,实际开发工作中建立联合索引时,要把区分度大的字段排在前面

 

标签:前缀,扫描,Tree,查询,索引,原理,优化,节点
From: https://www.cnblogs.com/jiaozg/p/17214780.html

相关文章

  • 为什么要使用线程池?创建线程池的参数有哪些?线程池的原理是什么?
    为什么要使用线程池?线程池有一下优点:线程在是非常宝贵的资源,使用线程池可以重复使用线程,避免频繁的创建和销毁线程所带来的系统损耗。可以根据系统的具体情况调整线程......
  • Webpack底层原理及核心概念实际应用(一篇封神系列)
    Webpack是一个流行的打包工具,用于构建大型前端项目。它在前端社区中广泛使用,并且已成为前端开发中必不可少的工具之一。本篇文章将对Webpack的工作原理进行深入讲解并附带代......
  • EasyCVR视频融合平台国标级联编辑页面的样式优化
    EasyCVR视频融合平台部署轻快、功能灵活,可支持多协议、多类型设备接入,在视频能力上,可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、集群、智能分析以及平......
  • chatPDF原理学习
    一.很火的chatPDF.分析原因,想一下能和一本书沟通,这本身就是一件神奇的事情,再者,它能帮助你通过聊天的方式学习到其中的内容,调动了学习的乐趣.除了装X外,乐趣......
  • Mybatis的工作原理
    mybatis的工作原理mybatis基本工作原理封装sql->调用JDBC操作数据库->返回数据封装JDBCQ:JDBC是什么?Java中规范客户端程序如何访问数据库的应用程序接口J。驱动......
  • React有Fiber架构 为什么还需要 useTransition( ) 钩子优化 ?
    因为fiber的最小单元是React元素,对于一个非常耗时的函数,fiber是无法把一个函数拆分成几部分去执行的,仍然会有顶帧(卡顿)的现象发生,此时就需要使用useTransition(()=>目标Func......
  • kubernetes集成GPU原理
    这里以NvidiaGPU设备如何在Kubernetes中管理调度为例研究,工作流程分为以下两个方面:如何在容器中使用GPUKubernetes如何调度GPU容器中使用GPU想要在容器中的应用可......
  • FastJson 反序列化漏洞原理分析
    Fastjson简介fastjson框架:https://github.com/alibaba/fastjsonfastjson-jndi:https://github.com/earayu/fastjson_jndi_pocfastjson是阿里巴巴开发的java语言编写的......
  • 知识图谱-TransE模型原理
    1.TransE模型介绍1.1TransE模型引入知识图谱补全任务的前提任务是知识表示学习,在知识表示学习中,最为经典的模型就是TransE模型,TransE模型的核心作用就是将知识图谱中的三......
  • 优化算法
    梯度更新:随机梯度,minbath梯度,全量梯度动量法:引入一阶动量,动量法是为了解决传统的梯度下降算法收敛很慢的问题。相当于每次在进行参数更新的时候,都会将之前的速度考虑进来,......