首页 > 数据库 >MySQL索引的基本理解

MySQL索引的基本理解

时间:2023-02-08 21:55:05浏览次数:39  
标签:name 节点 索引 理解 InnoDB MySQL 主键

之前一致以为索引就是简单的在原表的数据上加了一些编号,让查询更加快捷。后来发现里面还有更深的知识。

索引用于快速查找具有特定列值的行。如果没有索引,MySQL 必须从第一行开始,然后通读整个表以找到相关行。表数据越多,成本就越高。如果表有相关列的索引,MySQL 可以快速确定要在数据文件中间查找的位置,而无需查看所有数据。这比顺序读取每一行要快得多。

自从MySQL5.5版本之后,MySQL的默认存储引擎就变成了InnoDB。

-- 查看当前数据库支持的搜素引擎
show ENGINES;

image-20230208210612035

当我们创建一个表时,InnoDB引擎会根据主键给我们创建一个聚簇索引树。

会形成一个只有叶子节【最下面的节点】点存储数据的B+ tree。
除了叶子节点,其余的节点存储的是主键的值以及指向下一个节点的指针信息

image-20230208212259967

先看官方说明:

image-20230208211100553

image-20230208212336880

简而言之:

InnoDB默认会给创建一个根据主键id的聚簇索引的B+ tree,如果没有主键就根据下面的规则:

InnoDB聚集索引的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引:

(1)如果表定义了主键,则主键就是聚集索引;

(2)如果表没有定义主键,则第一个not NULL unique列是聚集索引;

(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;

后面我们再创建的索引统一被称之为二级索引(非主键索引、辅助索引),当然也会创建一个B+ tree。

只不过相较于聚簇索引的B+ tree来说,二级索引叶子节点上存储的为数据为主键的值,聚簇索引的叶子节点上存储的为真正的一条数据。

好处:

​ 避免了当数据发生修改的时候,大量B+ tree跟着修改。

那二级索引被触发后,是怎么查询到数据的?

答:

​ 这涉及到了两个概念:

  1. 回表

    ​ 通过二级索引(辅助索引)树查询索引数据,然后再通过聚集索引树查询完整数据的过程称为回表。

  2. 覆盖

    ​ select字段已经包含在用到的索引中的时候称为覆盖索引。

    ​ 比如说:我们创建了一个关于name字段的索引,当我们查询name的时候就会触发覆盖索引

可以通过EXPLAIN关键字查看时候出发了覆盖:

执行计划中出现Using index 字样,表示用到了覆盖索引,没有产生回表的操作。

-- 创建一个组合索引
create index idx_name_sex on t_user(name,sex);
-- 触发了覆盖索引
EXPLAIN SELECT name,sex from t_user where name = 'name4999008'
-- 触发了覆盖索引
EXPLAIN SELECT name from t_user where name = 'name4999008' and sex = '男'
-- 没有触发覆盖索引
EXPLAIN SELECT * from t_user where name = 'name4999008'

image-20230208214350542

标签:name,节点,索引,理解,InnoDB,MySQL,主键
From: https://www.cnblogs.com/beishanqingyun/p/17103452.html

相关文章

  • 官网查找mysql安装包
    通过浏览器输入官网url:www.mysql.com打开以后的样子  找到downloads进入  鼠标中键翻页找到社区下载(MySQLCommunity(GPL)Downloads»)进入  找到mys......
  • 浅析mysql报错:Error writing file '/tmp/MY4QWdUa' (Errcode: 28 - No space left on
    一、问题背景1、报错描述:今天执行sql时发现Node服务的日志报错:SequelizeDatabaseError:EE_WRITE:Errorwritingfile'/tmp/MY4QWdUa'(Errcode:28-Nospac......
  • mysql压缩表小记
    参考文档:https://www.163.com/dy/article/GI4CH5N305319P76.htmlhttps://learn.lianglianglee.com/专栏/MySQL实战宝典/06表压缩:不仅仅是空间压缩.mdhttps://blog.csd......
  • 1.6通过地址和索引实现数组
       这一小节是表1-1中出现的基址寄存器和变址寄存器。通过这两个寄存器,我们可以对主内存上特定的内存区域进行划分,从而实现类似数组的操作。   首先,我们用十......
  • 聊下 Clickhouse MergeTree 的分区,索引,标记和压缩数据
    今天花了一天把《ClickHouse原理解析与应用实践》过了一遍,除了感叹诸多结构都为了节省每一个byte做到极致,也感受到要理解某些设计又一点压力。看完之后我感觉差不多理......
  • MySQL 定时备份数据库
    在操作数据过程中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库。本篇文章主要讲述了几种方法进行 MySQL定时备份数据库。一.mysqldump命令备......
  • Linux安装Mysql 5.7
    1. 查看CentOS自带MySQL5.1组件并卸载;rpm -qa | grep -i mysqlrpm e -nodeps mysql-libs-5.1.61-4.el6.x86_64 2. 安装依赖(MySQL5.5并不需要这个依赖,但是5.7......
  • MYSQL5.7索引异常引发的锁超时处理记录
    原始sql:updateaseta.x=xwherea.xidin(selectb.xidfrombinnerjoinconb.xxx=c.xxx)anda.xdate='xxxxxxxx'现象sql执行中,b表会偶尔提示锁超时。处理......
  • MySQL DISTINCT关键字详解:用法、实际应用和与GROUP BY的区别
    "Successisnothowhighyouhaveclimbed,buthowyoumakeapositivedifferencetotheworld."成功不在于你爬得多高,而在于你对世界做出了多大的积极影响。-Roy......
  • Mysql数据库备份恢复
    一、使用musqldump对数据库、数据库表、一个数据库多个表、所以数据库备份、模拟数据丢失二、配置mysql数据库开启二进制日志功能,配置二进制日志切割,配置跟二进制恢复数据,居......