MySQL索引相关知识学习心得
你知道的越多,你不知道的也就越多 —— 芝诺曾
一、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索引相关知识学习心得的更多相关文章
- mysql 索引相关知识
由where 1 =1 引发的思考 最近工作上被说了 说代码中不能用 where 1=1,当时觉得是应该可以用的,但是找不到什么理据, 而且mysql 语句优化这方面确实很薄弱 感觉自己mysql ...
- MongoDB 索引相关知识
背景: MongoDB和MySQL一样,都会产生慢查询,所以都需要对其进行优化:包括创建索引.重构查询等.现在就说明在MongoDB下的索引相关知识点,可以通过这篇文章MongoDB 查询优化分析了解 ...
- mysql 索引相关
引言: MYSQL由于其免费和开源的性质,在项目中用处广泛.大家都知道,一个MySQL数据库能够储存大量的数据,如果要在大量的数据中查找某一个数据,如果使用全表检索的话,即费时间又费力气,这时,就需要 ...
- MySql索引下推知识分享
作者:刘邓忠 Mysql 是大家最常用的数据库,下面为大家带来 mysql 索引下推知识点的分享,以便巩固 mysql 基础知识,如有错误,还请各位大佬们指正. 1 什么是索引下推 索引下推 (Ind ...
- mysql数据库相关知识
什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库.(来自:百度) 什么是sql? 结构化查询语言(Struct ...
- 数据库(mysql)相关知识
单表查询 排序 升序 select*from表名 order by字段 asc; 降序 select*from表名 order by字段 desc; 条件查询(包括通配符) ...
- MySQL 索引的知识整理
前言: 很多面试者,在面试的时候,都会回答,”索引就相当于一本书的字典,有了他能够很快的找到数据”, 这种答案好像在读书的时候老师告诉这么说的吧.今天来全面的描述一下数据库索引的原理及优化 ...
- 客户端相关知识学习(十二)之iOS H5交互Webview实现localStorage数据存储
前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...
- 客户端相关知识学习(十一)之Android H5交互Webview实现localStorage数据存储
前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...
- MYSQL索引的深入学习
通常大型网站单日就可能会产生几十万甚至几百万的数据,对于没有索引的表,单表查询可能几十万数据就是瓶颈. 一个简单的对比测试 以我去年测试的数据作为一个简单示例,20多条数据源随机生成200万条数据,平 ...
随机推荐
- 《HTTP权威指南》– 5.Web服务器
Web服务器概念: 实现了HTTP和相关的TCP连接处理,负责管理Web服务器提供的资源,以及对Web服务器的配置.控制及扩展方面的管理. 各种不同的形式: 通过软件Web服务器:运行在标准的.有网络 ...
- 伙伴福利,100个项目彻底精通Java!【开源】
为了帮助更多的小伙伴,快速成长进步,冲进大厂中厂,我分享了很多的项目哟,例如: java项目精品实战案例 | JavaSwing实战项目 但很多小伙伴,还觉得不够,好吧!今天就拿出压箱底的项目,给支持 ...
- 前缀树(Tire)—Python
核心思想 空间换时间,是一种用于快速减速的多叉树结构,利用字符串的公共前缀来降低时间 优缺点: 优点:查询效率高,减少字符比较 缺点:内存消耗较大 每次都会从头向下一直到字符串结尾 前缀树 1 单个字 ...
- flutter系列之:移动端手势的具体使用
目录 简介 赋予widget可以点击的功能 会动的组件 可删除的组件 总结 简介 之前我们介绍了GestureDetector的定义和其提供的一些基本的方法,GestureDetector的好处就是可 ...
- 从源码层面深度剖析Spring循环依赖
作者:郭艳红 以下举例皆针对单例模式讨论 图解参考 https://www.processon.com/view/link/60e3b0ae0e3e74200e2478ce 1.Spring 如何创建 ...
- 物联网 IOT 设备如何脱离信息孤岛?
以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/tb5eOFNUZLtPPLipLAh3vA 本文大概 1435 个 ...
- [python]《Python编程快速上手:让繁琐工作自动化》学习笔记1
1. 模式匹配与正则表达式笔记(第7章)(代码下载) 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念. ...
- [编程基础] Python中*args和**kwargs参数的使用
本文主要介绍Python中*args和**kwargs参数的使用 文章目录 1 使用 2 拓展 3 参考 1 使用 在Python中,定义函数时可以使用两个特殊符号,以允许它们接受可变数量的参数.这两 ...
- 买不到的数目【第四届蓝桥杯省赛C++A组,第四届蓝桥杯省赛JAVAC组】
买不到的数目 小明开了一家糖果店. 他别出心裁:把水果糖包成4颗一包和7颗一包的两种. 糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合. 当然有些糖果数目是无法组合出来的,比如要买 10 ...
- CF1744B Even-Odd Increments
简要题意 \(T\) 组数据,每组数据给定一个长度为 \(n\) 的数列,有 \(q\) 次操作,共有两种操作: \(\texttt{0 x}\),给数列中所有偶数加上 \(x\): \(\textt ...