你知道的越多,你不知道的也就越多 —— 芝诺曾

一、MySQL索引学习

MySQl主要有两种类型的索引:哈希索引、B+树索引

1、哈希索引

哈希索引可以以O(1)的时间复杂度进行查找,但是这样查找导致其失去了有序性,无法用于排序和分组、只支持精确查找,无法用于部分查找和范围查找

自适应哈希索引:

该概念为InnoDB存储引擎的特殊功能,当某个索引值被频繁使用的时候,就会在B+树索引之上再创建一个哈希索引,这样就可以让B+树索引拥有一些哈希索引的优点,比如快速的哈希查找。

2、B+树索引

是大多数 MySQL 存储引擎的默认索引类型。

因为不再需要进行全表扫描,只需要对树进行搜索即可,所以查找速度快很多。

因为 B+ Tree 的有序性,所以除了用于查找,还可以用于排序和分组。

可以指定多个列作为索引列,多个索引列共同组成键。

适用于全键值、键值范围和键前缀查找,其中键前缀查找只适用于最左前缀查找。如果不是按照索引列的顺序进行查找,则无法使用索引。

B+树索引可以分为聚簇索引和非聚簇索引。

聚簇索引:主索引的叶子结点上保存着完整的数据记录

非聚簇索引:索引的叶子结点上记录的是主键的值,在使用其进行查找的时候,需要先找到主键的值,然后再到主索引中进行查找,这个过程被称为回表。

聚簇索引和非聚簇索引的特点及区别:

  • 聚簇索引有唯一性:因为其是把数据和索引结构放到一块的,因此一个表中只有一个聚簇索引
  • 聚簇索引适合用在排序的场合,非聚簇索引不适合
  • 取出一定范围的数据的时候,比较适合使用聚簇索引
  • 可以把相关的数据保存到一起,在实现电子邮箱的时候,可以根据用户ID来聚集数据,这样只需要从磁盘中读取少数的数据页就可以获取某个用户的全部邮件
  • 聚簇索引的劣势:维护索引很昂贵,特别是插入新行或者主键被更新导致需要进行分页的时候

二、常见的索引相关数据结构

1、B+树

B+树包含2种类型的节点:内部结点(又叫做索引结点)和叶子结点。其与B树的最大的区别为内部节点不保存数据,只用于索引,所有的数据以及记录都保存在叶子结点当中。

其内部结点的key都按照从小到大的顺序进行排列,对于内部结点中的一个key,左树中的所有的key都小于它,右树中的所有的key都大于它,叶子结点中的记录也是按照key的大小进行排列的。

更多内容请见:https://zhuanlan.zhihu.com/p/54102723

B+树的优点

  • B+树的磁盘IO更低;
  • B+树的查询也更加稳定(因为数据存储在叶子结点中,因此所有关键字的查询都必须是从根结点到叶子结点这样一条完整的路,所有的关键字查询的路径是相同的,因此每一个数据的查询效率都是一致的);
  • B+树的元素遍历效率更高,B+树只要遍历叶子结点就可以实现整棵树的遍历。

三、特殊类型的索引

1、覆盖索引

覆盖索引即从非主键索引中就能查到的记录,而不需要去查询主键索引中的记录,避免了回表的产生进而减少了树的搜索速度,可以显著提升性能。

个人理解:从非主键数据中查询主键的值(可以这样理解,但是要注意聚簇索引中存储的索引不一定是主键)

2、联合索引

这个和覆盖索引很像,还是一个上面的学生表为例,我们建立了name和age的联合索引,通过name可以直接查询到age,不需要回表操作。

要说联合索引和覆盖索引的区别呢?可以说覆盖索引是联合索引的最优解。

联合索引遵循最左侧匹配原则,比如(name,age),索引可以是name或者name和age的组合,看,后面这种情况就是覆盖索引,所以说,覆盖索引是联合索引的最优解。

3、最左前缀原则

在mysql建立联合索引的时候会遵循最左前缀匹配的原则,即最左侧的优先,在检索数据的时候从联合索引的最左边开始匹配。

很多时候我们就可以根据最左前缀原则判断当前的查询能不能命中我们设定的索引。

4、索引下推

索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。

在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件 。

在使用ICP的情况下,如果存在某些被索引的列的判断条件时,MySQL服务器将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合MySQL服务器传递的条件,只有当索引符合条件时才会将数据检索出来返回给MySQL服务器 。

索引下推在非主键索引上的优化,可以有效的减少回表的次数,大大提升了查询的效率。

5、前缀索引

前缀索引顾名思义,定义字符串的一部分内容当作索引,而不是把整个字符串都当作索引。默认的,如果我们创建索引的语句不指定前缀的长度的时候,那么这个索引就会包含整个字符串。

四、原文链接

https://blog.csdn.net/SeekN/article/details/118524933?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166297664516782391822775%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166297664516782391822775&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-2-118524933-null-null.142v47pc_rank_34_2,201v3control_1&utm_term=MySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B4%A2%E5%BC%95&spm=1018.2226.3001.4187

MySQL索引相关知识学习心得的更多相关文章

  1. mysql 索引相关知识

    由where 1 =1 引发的思考 最近工作上被说了 说代码中不能用 where 1=1,当时觉得是应该可以用的,但是找不到什么理据, 而且mysql 语句优化这方面确实很薄弱   感觉自己mysql ...

  2. MongoDB 索引相关知识

    背景: MongoDB和MySQL一样,都会产生慢查询,所以都需要对其进行优化:包括创建索引.重构查询等.现在就说明在MongoDB下的索引相关知识点,可以通过这篇文章MongoDB 查询优化分析了解 ...

  3. mysql 索引相关

    引言: MYSQL由于其免费和开源的性质,在项目中用处广泛.大家都知道,一个MySQL数据库能够储存大量的数据,如果要在大量的数据中查找某一个数据,如果使用全表检索的话,即费时间又费力气,这时,就需要 ...

  4. MySql索引下推知识分享

    作者:刘邓忠 Mysql 是大家最常用的数据库,下面为大家带来 mysql 索引下推知识点的分享,以便巩固 mysql 基础知识,如有错误,还请各位大佬们指正. 1 什么是索引下推 索引下推 (Ind ...

  5. mysql数据库相关知识

    什么是数据库?                数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库.(来自:百度) 什么是sql? 结构化查询语言(Struct ...

  6. 数据库(mysql)相关知识

      单表查询   排序   升序   select*from表名 order by字段 asc;   降序   select*from表名 order by字段 desc;   条件查询(包括通配符) ...

  7. MySQL 索引的知识整理

    前言:       很多面试者,在面试的时候,都会回答,”索引就相当于一本书的字典,有了他能够很快的找到数据”, 这种答案好像在读书的时候老师告诉这么说的吧.今天来全面的描述一下数据库索引的原理及优化 ...

  8. 客户端相关知识学习(十二)之iOS H5交互Webview实现localStorage数据存储

    前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...

  9. 客户端相关知识学习(十一)之Android H5交互Webview实现localStorage数据存储

    前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...

  10. MYSQL索引的深入学习

    通常大型网站单日就可能会产生几十万甚至几百万的数据,对于没有索引的表,单表查询可能几十万数据就是瓶颈. 一个简单的对比测试 以我去年测试的数据作为一个简单示例,20多条数据源随机生成200万条数据,平 ...

随机推荐

  1. “XZ”格式文件解压

    1.下载xz 官网:https://tukaani.org/xz/ 例:wget https://nchc.dl.sourceforge.net/project/lzmautils/xz-5.2.6. ...

  2. SQL语句查询关键字

    SQL语句查询关键字前戏 SQL语句中关键字的执行顺序和编写顺序并不是一致的,可能会错乱 eg: select id,name from userinfo;我们先写的select再写的from,但是执 ...

  3. JavaScript:变量的作用域,window对象,关键字var/let与function

    为什么要将这些内容放在一起,因为他们都跟初始化有关系,我们慢慢说吧. 我们在代码中,都会声明变量.函数和对象,然后由浏览器解释器(下面简称浏览器)执行: 我们还说过,变量和对象的内存结构: 那么,是什 ...

  4. 把ChatGPT配置到微信群里,可以对AI提问了!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言:用的很爽! 自从小傅哥用上 ChatGPT 连搜索引擎用的都不多了,很多问题的检索我 ...

  5. Mapper的动态代理

    可以自动生产接口的实现类 ,所以就不需要再写daoImpl这个实现类了, 直接使用sqlSession.getMapper自动生成实现类 @Before 此注解的目的是为了将@Befoe 作为首先执行 ...

  6. 利用Redisson实现订单关闭

    实体类 为了方便测试,直接在测试类中的写内部类: @Data @AllArgsConstructor @NoArgsConstructor public class OrderInfo { /** * ...

  7. [编程基础] C++多线程入门8-从线程返回值

    原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 8 从线程返回值 8 ...

  8. [OpenCV实战]13 OpenCV中使用Mask R-CNN进行对象检测和实例分割

    目录 1 背景介绍 1.1 什么是图像分割和实例分割 1.2 Mask-RCNN原理 2 Mask-RCNN在OpenCV中的使用 2.1 模型下载 2.2 模型初始化 2.3 模型加载 2.4 输出 ...

  9. day05-Vue02

    Vue02 7.修饰符 7.1基本说明 修饰符(Modifiers)是以.指明的后缀,指出某个指令以特殊方式绑定 官方文档:修饰符 Vue中的修饰符有: 事件修饰符 按键修饰符 系统修饰符 事件修饰符 ...

  10. python之路33 MySQL 1

    存取数据的演变 1.文本文件 文件路径不固定:C:\aaa.txt D:\bbb.txt E:\ccc.txt 数据格式不统一:jason|123 jason$123 jason 123 2.软件开发 ...