数据库回表介绍

  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的索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值