MySQL索引的基本理解
之前一致以为索引就是简单的在原表的数据上加了一些编号,让查询更加快捷。后来发现里面还有更深的知识。
索引用于快速查找具有特定列值的行。如果没有索引,MySQL 必须从第一行开始,然后通读整个表以找到相关行。表数据越多,成本就越高。如果表有相关列的索引,MySQL 可以快速确定要在数据文件中间查找的位置,而无需查看所有数据。这比顺序读取每一行要快得多。
自从MySQL5.5版本之后,MySQL的默认存储引擎就变成了InnoDB。
-- 查看当前数据库支持的搜素引擎
show ENGINES;

当我们创建一个表时,InnoDB引擎会根据主键给我们创建一个聚簇索引树。
会形成一个只有叶子节【最下面的节点】点存储数据的B+ tree。
除了叶子节点,其余的节点存储的是主键的值以及指向下一个节点的指针信息。

先看官方说明:


简而言之:
InnoDB默认会给创建一个根据主键id的聚簇索引的B+ tree,如果没有主键就根据下面的规则:
InnoDB聚集索引的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引:
(1)如果表定义了主键,则主键就是聚集索引;
(2)如果表没有定义主键,则第一个not NULL unique列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
后面我们再创建的索引统一被称之为二级索引(非主键索引、辅助索引),当然也会创建一个B+ tree。
只不过相较于聚簇索引的B+ tree来说,二级索引叶子节点上存储的为数据为主键的值,聚簇索引的叶子节点上存储的为真正的一条数据。
好处:
避免了当数据发生修改的时候,大量B+ tree跟着修改。
那二级索引被触发后,是怎么查询到数据的?
答:
这涉及到了两个概念:
回表
通过二级索引(辅助索引)树查询索引数据,然后再通过聚集索引树查询完整数据的过程称为回表。
覆盖
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'

MySQL索引的基本理解的更多相关文章
- mysql - 索引的一些理解
推荐下这篇文章 http://blog.codinglabs.org/articles/theory-of-mysql-index.html 写的十分的不错.留着以后慢慢看,慢慢的理解.
- 深入理解mysql索引
深入理解mysql索引 1 深入理解索引 1.1 索引基础理论知识: 1.2 B+树索引 1.3 哈希索引 1.4 理解B+树.哈希索引结构及区别: 1.5 理解常见索引的基本概念:主键索引.唯一索引 ...
- 理解MySQL——索引与优化
转自:理解MySQL——索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存 ...
- 【转】mysql索引最左匹配原则的理解
作者:沈杰 链接:https://www.zhihu.com/question/36996520/answer/93256153 来源:知乎 CREATE TABLE `student` ( `id` ...
- mysql索引最左匹配原则的理解
CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `ci ...
- 【索引】理解MySQL——索引与优化
MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索 ...
- 【转】Mysql索引最左匹配原则理解
作者:沈杰 链接:https://www.zhihu.com/question/36996520/answer/93256153来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- Mysql高手系列 - 第22篇:深入理解mysql索引原理,连载中
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...
- 要想深入理解mysql索引?这16个点你必须要了解!
前言 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQ ...
- 你真的理解索引吗?从数据结构层面解析mysql索引原理
从<mysql存储引擎InnoDB详解,从底层看清InnoDB数据结构>中,我们已经知道了数据页内各个记录是按主键正序排列并组成了一个单向链表的,并且各个数据页之间形成了双向链表.在数据页 ...
随机推荐
- python-面向对象属性的访问与self的理解
属性访问 类属性与对象属性 在类中定义的名字,都是类的属性,细说的话,类有两种属性:数据属性和函数属性,可以通过__dict__访问属性的值,比如Person1.__dict__['student'] ...
- JavaScript笔记之面向对象
面向对象 了解构造函数原型对象的语法特征,掌握 JavaScript 中面向对象编程的实现方式,基于面向对象编程思想实现 DOM 操作的封装. 了解面向对象编程的一般特征 掌握基于构造函数原型对象的逻 ...
- 4.5:HDFS操作实验
〇.概述 1.拓扑结构 2.目标 进行HDFS的实验,了解HDFS的基本操作. 一.常用操作 1.启动 50070 2.查看及创建 3.上传文件
- 【Java EE】Day10 JavaScript高级、DOM、BOM、事件
一.简单入门 1.DOM 功能:获取html文档内容 代码:document.getElementById("id值") 功能: 设置属性值 修改标签体内容:xx.innerHtm ...
- Graph Neural Network——图神经网络
本文是跟着李沐老师的论文精度系列进行GNN的学习的,详细链接请见:零基础多图详解图神经网络(GNN/GCN)[论文精读] 该论文的标题为<A Gentle Introduction to Gra ...
- JavaScript:this指针
this指针,存储的是一个内存地址,如同变量一样,指向一块内存区域: 而这个内存区域,保存的就是一个对象的数据,那么这个对象是什么呢? 通常来说,this指针,主要是用在方法(函数)中,用来指向调用方 ...
- netkit-telnet源码编译安装
介绍 Linux 下流行的 telnet 实现有两个: GNU inetutils: http://ftp.gnu.org/gnu/inetutils/ 哈佛netkit-telnet 源码包:htt ...
- Law of Iterated Expectations & Covariance
Law of Iterated Expectations \(E[Y] = E_X[E[Y |X]].\) The notation \(E_X[.]\) indicates the expectat ...
- 已完成 10000 多次提交,Solon Java Framework v1.12.1 发布
一个更现代感的 Java 应用开发框架:更快.更小.更自由.没有 Spring,没有 Servlet,没有 JavaEE:独立的轻量生态.主框架仅 0.1 MB. @Controller public ...
- DVWA靶场实战(六)——Insecure CAPTCHA
DVWA靶场实战(六) 六.Insecure CAPTCHA: 1.漏洞原理: Insecure CAPTCHA(不安全的验证码),CAPTCHA全程为Completely Automated Pub ...