当前位置: 首页 > news >正文

数据库回表介绍

  1. 索引覆盖
    1. 索引覆盖或称为覆盖索引,是数据库中的一种优化手段
    2. 当我们在执行一个sql查询时,如果只需要查询某几个字段的值,并且这几个字段的数据都已经被包含在某一个索引中(而不是全表扫描),那么数据库引擎就会直接通过这个索引来取得数据,而无需再回表查询,从而大大减少IO操作,提高了查询效率
    3. 索引覆盖的优点:
      1. 减少IO次数,:因为通过覆盖索引可以直接获取数据,所以不需要再回表查询,从而减少了IO次数
      2. 提高查询速度:由于减少了IO操作,查询速度自然也得到了提高
      3. 索引的选择性:选择性是指不重复的索引值与数据表的总记录数的比值,选择性越高,通过索引筛选出来的数据就越少,从而提高了查询效率
  2. 回表
    1. sql回表是指在使用非聚簇索引(也称为辅助索引或二级索引)进行查询时,由于非聚簇索引中只存储了索引字段的值和对应的主键(聚簇索引)键值,因此,如果需要获取非索引列的数据,则需要根据主键(聚簇索引)中的键值去查找实际的数据行,这个过程被称为回表
    2. 回表的原理:
      1. 非聚簇索引结构:非聚簇索引的叶子节点存储的是索引列的值,主键的值
      2. 查询过程:
        1. 当使用非聚簇索引进行查询时,首先通过非聚簇索引找到满足条件的主键键值,然后根据这些主键键值,在回到聚簇索引(主键索引)中查找完整的数据行
  3. 举例:
    1. 假设有一个用户表users,包含id(主键),name和age三个字段,其中在name字段上建立了非聚集索引
    2. 执行查询 select * from users where name = ‘tom’;时,会发生回表,因为首先会通过name上的非聚集索引找到满足条件的id,然后再根据这些id,回到聚簇索引中查找完整的用户数据
    3. 而查询select id,name from users where name = ‘tom’;则不会回表,因为所需的数据都在非聚簇索引中可以找到
    4. 而回表操作会增加IO次数,从而可能影响查询性能,特别是在大表和复杂查询场景下,回表操作可能成为性能瓶颈
    5. 为了减少回表操作,可以考虑将需要查询的字段加入到索引中,形成复合索引(也称联合索引或覆盖索引),这样查询时就可以直接从索引中国获取需要的数据,而无需回表
  4. 最左匹配原则:
    1. 主要是在是复合索引(也称为多列索引或多字段索引)时的一个关键概念,这个原则指出,当使用复合索引进行查询时,查询条件应该尽可能地从索引的最左边开始匹配,这样索引才能被有效地使用
    2. 当你基于复合索引进行查询时,查询条件必须包含索引的最左边的一列或多列,以便索引能够有效地使用,例如:如果你有一个基于last_name,first_name的复合索引,一下查询可以有效地使用这个索引:
      1. 查询基于last_name: select * from employees where last_name = ‘smith’;
      2. 查询基于laset_name和first_name: select * from employees where last_name = ‘smith’ and first_name =‘john’;
      3. 但是一下查询则不能有效地使用这个索引(因为他没有包含索引的最左边的列last_name)
      4. 查询基于:first_name: select * from employees where first_name = ‘john’;
    3. 在创建复合索引时,列的顺序很重要,你应该将最常用于查询条件的列放在索引的最左边,例如:如果你经常基于last_name进行查询,但很少基于first_name进行查询,那么你应该创建一个基于last_name和first_name的索引,而不是基于first_name和last_name的索引
http://www.lryc.cn/news/387459.html

相关文章:

  • python多继承的3C算法
  • 掌握Python编程的深层技能
  • Echarts地图实现:各省市计划录取人数
  • shell脚本if/else使用示例
  • 【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(二)
  • Java中的Monad设计模式及其实现
  • Dahlia Hart: Stylized Casual Character(休闲角色模型)
  • vector容器
  • 二进制常用知识整理<java>
  • 基于Docker的淘客返利平台部署
  • 【涵子来信科技潮流】——WWDC24回顾与暑假更新说明
  • 重温react-08(createContext使用方式)
  • LInux后台运行程序
  • DEBOPIE框架:打造最好的ChatGPT交易机器人
  • C++ Thead多线程 condition_variable 与其使用场景---C++11多线程快速学习
  • 什么是前端开发?
  • 大数据面试题之Spark(1)
  • Spring Boot 和 Spring Framework 的区别是什么?
  • JVM原理(四):JVM垃圾收集算法与分代收集理论
  • 1961 Springboot自习室预约系统idea开发mysql数据库web结构java编程计算机网页源码maven项目
  • 前端面试题(12)答案版
  • SpringMVC 域对象共享数据
  • 每天五分钟深度学习框架pytorch:tensor向量之间常用的运算操作
  • 【数据结构】(C语言):栈
  • c++类成员指针用法
  • [240625] Continue -- 开源 Copilot | Web-Check 网站分析工具 | Story of EOL
  • 【Mac】Auto Mouse Click for Mac(高效、稳定的鼠标连点器软件)软件介绍
  • javaSE知识点整理总结(下)、MySQL数据库
  • Perl入门学习
  • 2024年7月计划(ue5肉鸽视频完成)