您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

MySQL索引,快速记忆法

时间:2023-05-26 13:39:14  来源:微信公众号  作者:Java技术指北


哈喽,大家好,我是了不起。面试的时候,面试官总喜欢问一些关于MySQL索引的问题,但是如果单纯的记忆,还是有难度的;今天了不起把MySQL索引的知识点进行汇总,方便大家快速记忆MySQL索引的相关知识点。赶快收藏此文章吧!

索引结构:B+树

索引其实是一种数据结构

注意B+树是MySQL,索引默认的结构;一张表至少有一个索引(主键索引),是可以有多个索引的

MySQL中的B+Tree

  1. 非叶子节点也叫内部节点,只存储 健值(主键的值) + 指针(存储子节点的地址信息)

主键索引:健值(主键的值) + 指针(存储子节点的地址信息)

非主键索引:非主键列的值 + 指向下一个节点的指针(存储子节点的地址信息)

  1. 所有的数据都存在叶子节点中;
  • 同时叶子节点上还存有一个指向相邻叶子节点的指针

  • 如果是聚簇索引(主键索引),叶子节点存储的是实际数据

  • 如果是非聚簇索引,则保存的是聚簇索引的索引key,也就是主键索引的值;查询非聚簇索引会有一个回表操作

  1. B+Tree的每个叶子节点增加了一个指向相邻叶子节点的指针,它的最后一个数据会指向下一个叶子节点的第一个数据,形成了一个有序链表的结构。

为什么B+ 树比B 树更适合作为索引?

  1. B+ 树的磁盘读写代价更低 B+ 树的数据都集中在叶子节点,分支节点 只负责指针(索引);B 树的分支节点既有指针也有数据 。这将导致B+ 树的层高会小于B 树的层高,也就是说B+ 树平均的Io次数会小于B 树。
  2. B+ 树的查询效率更加稳定 B+ 树的数据都存放在叶子节点,故任何关键字的查找必须走一条从根节点到叶子节点的路径。所有关键字的查询路径相同,每个数据查询效率相当。
  3. B+树更便于遍历 由于B+树的数据都存储在叶子结点中,分支结点均为索引,遍历只需要扫描一遍叶子节点即可;B树因为其分支结点同样存储着数据,要找到具体的数据,需要进行一次中序遍历按序来搜索。
  4. B+树更擅长范围查询 B+树叶子节点存放数据,数据是按顺序放置的双向链表。B树范围查询只能中序遍历。
  5. B+ 树占用内存空间小 B+ 树索引节点没有数据,比较小。在内存有限的情况下,相比于B树索引可以加载更多B+ 树索引。

MyISAM与InnoDB 的区别

  1. InnoDB支持事务,MyISAM不支持
  2. InnoDB支持外键,而MyISAM不支持
  3. InnoDB是聚集索引,数据和索引存到同一个文件里;MyISAM是非聚集索引,数据和索引不在同一个文件里;都是使用B+Tree作为索引结构
  4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件)

因为InnoDB的事务特性,在同一时刻表中的行数对于不同的事务而言是不一样的,因此count统计会计算对于当前事务而言可以统计到的行数,而不是将总行数储存起来方便快速查询。InnoDB会尝试遍历一个尽可能小的索引除非优化器提示使用别的索引。如果二级索引不存在,InnoDB还会尝试去遍历其他聚簇索引。

如果索引并没有完全处于InnoDB维护的缓冲区(Buffer Pool)中,count操作会比较费时。可以建立一个记录总行数的表并让你的程序在INSERT/DELETE时更新对应的数据。和上面提到的问题一样,如果此时存在多个事务的话这种方案也不太好用。如果得到大致的行数值已经足够满足需求可以尝试SHOW TABLE STATUS

  1.  

那么为什么InnoDB没有了这个变量呢?

  1. InnoDB支持表、行(默认)级锁,而MyISAM仅支持表级锁
  2. InnoDB表必须有唯一索引(如主键)(用户没有指定的话会自己找/生产一个隐藏列Row_id来充当默认主键),而Myisam可以没有主键
  3. Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI
  • Innodb:frm是表定义文件,ibd是数据文件

  • Myisam:frm是表定义文件,myd是数据文件,myi是索引文件

索引失效的场景

  1. 对索引列使用了函数、表达式或运算符:当查询条件中使用了函数、表达式或运算符时,MySQL就无法使用该列的索引,因为它需要对每行数据进行计算,而不是直接查找索引。
  2. 查询条件中使用了不等于操作符(<>、!=)、NOT NULL, NOT IN 等
  3. 模糊查询:当查询条件中使用了LIKE、%或_等模糊匹配符号时,MySQL无法使用索引进行快速定位。
  4. OR条件:当查询条件中包含多个OR条件时,MySQL无法使用索引进行快速定位。
  5. 范围查询:当查询条件中使用了BETWEEN、<、>、<=、>=等操作符时,MySQL只能使用索引中的一部分数据,需要读取更多的数据进行过滤,降低了查询效率。
  6. 数据类型不匹配,需要隐式转换类型
  7. 对索引列进行排序,因为它需要将数据按照指定的顺序进行排序
  8. 复合索引,如果不使用前列,后续列也将无法使用

小结

正确的使用索引,能够显著提高数据库的查询效率。本文汇总了MySQL索引的常用知识点,帮助大家快速记忆,快快收藏吧。



Tags:MySQL索引   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
哈喽,大家好,我是了不起。面试的时候,面试官总喜欢问一些关于MySQL索引的问题,但是如果单纯的记忆,还是有难度的;今天了不起把MySQL索引的知识点进行汇总,方便大家快速记忆MySQL索...【详细内容】
2023-05-26  Tags: MySQL索引  点击:(0)  评论:(0)  加入收藏
我们准备了索引的15连问,相信大家看完肯定会有帮助的。1. 索引是什么? 索引是一种能提高数据库查询效率的数据结构。它可以比作一本字典的目录,可以帮你快速找到对应的记录。 ...【详细内容】
2023-05-08  Tags: MySQL索引  点击:(34)  评论:(0)  加入收藏
之前松哥写过一个 MySQL 系列,但是当时是基于 MySQL5.7 的,最近有空在看 MySQL8 的文档,发现和 MySQL5.7 相比还是有不少变化,同时 MySQL 又是小伙伴们在面试时一个非常重要的知...【详细内容】
2023-04-13  Tags: MySQL索引  点击:(25)  评论:(0)  加入收藏
1 引言 在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行...【详细内容】
2023-04-06  Tags: MySQL索引  点击:(19)  评论:(0)  加入收藏
在我们的印象中,mysql数据表里无非就是存储一行行的数据。跟个excel似的。直接遍历这一行行数据,性能就是O(n),比较慢。为了加速查询,使用了B+树来做索引,将查询性能优化到了O(lg...【详细内容】
2022-04-18  Tags: MySQL索引  点击:(736)  评论:(0)  加入收藏
数据库索引对于程序开发人员都不陌生。开发系统时,都会使用各种各种的sql语句,最多的就是查询语句,为了提高系统的响应速度或者从数据库查询数据更快,都会寻找查询比较慢的SQL查...【详细内容】
2022-03-17  Tags: MySQL索引  点击:(374)  评论:(0)  加入收藏
Mysql索引数据结构下面列举了常见的数据结构 二叉树 红黑树 Hash表 B-Tree(B树)Select * from t where t.col=5我们在执行一条查询的Sql语句时候,在数据量比较大又不加索引的情...【详细内容】
2021-06-07  Tags: MySQL索引  点击:(214)  评论:(0)  加入收藏
聊聊Mysql索引和redis跳表 ---redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O(logn)(阿里)redis使用跳表不用B+数的原因是:redis是内存数据库,而B+树纯粹是为了m...【详细内容】
2021-02-05  Tags: MySQL索引  点击:(348)  评论:(0)  加入收藏
本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引...【详细内容】
2020-08-16  Tags: MySQL索引  点击:(108)  评论:(0)  加入收藏
为了能让索引能有更直观的效率,我在一张表里扔进了百万条数据(光靠这些数据,生成数据代码写了一个小时,解决MySQL8的文件导入权限问题解决了两个小时,导入数据花费了一个小时,我...【详细内容】
2020-08-05  Tags: MySQL索引  点击:(116)  评论:(0)  加入收藏
▌简易百科推荐
哈喽,大家好,我是了不起。面试的时候,面试官总喜欢问一些关于MySQL索引的问题,但是如果单纯的记忆,还是有难度的;今天了不起把MySQL索引的知识点进行汇总,方便大家快速记忆MySQL索...【详细内容】
2023-05-26  Java技术指北  微信公众号  Tags:MySQL索引   点击:(0)  评论:(0)  加入收藏
最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一探究竟,了解一下MongoDB的特点和基本用法。三分钟你将学会: Mongo...【详细内容】
2023-05-24  dbaplus社群    Tags:MongoDB集群   点击:(6)  评论:(0)  加入收藏
一、安装简介1.1 安装目的MySQL官方提供了InnoDB Cluster,该集群由MySQL MGR和MySQL Router组成。MySQL MGR在数据库层面实现自主高可用性,而MySQL Router则负责代理访问。在...【详细内容】
2023-05-24  GreatSQL社区    Tags:MySQL   点击:(7)  评论:(0)  加入收藏
作者:Anirban Rahut、Abhinav Sharma、Yichen Shen、Ahsanul Haque 我们推出 MySQL Raft 的目的是最终取代我们当前的 MySQL 半同步数据库。 MySQL Raft 最大的好处是简化了...【详细内容】
2023-05-22  闪念基因  今日头条  Tags:Meta   点击:(4)  评论:(0)  加入收藏
一、数据库的安装有如下几种方法:1.rpm包安装rpm包安装方法又分为:手动下载rpm安装和通过官方提供的yum源安装;我们当然要用yum安装,通过下载rmp包手动安装太麻烦了(一堆的依赖、...【详细内容】
2023-05-18  玩转Linux与MySQL  今日头条  Tags:mysql   点击:(11)  评论:(0)  加入收藏
1、覆盖索引 例子如下:id是主键索引,name是普通索引第三个sql,使用了回表查询,回表查询可以认为就是非覆盖索引。 2、前缀索引所谓前缀索引,说白了就是对文本的前几个字符建立索...【详细内容】
2023-05-11  轻松入门网  今日头条  Tags:mysql   点击:(9)  评论:(0)  加入收藏
utf8mb4 和 utf8 是 MySQL 中两种常用的字符集,它们都可以用来存储 Unicode 字符,但是有一些区别和联系。本文将从以下几个方面对比 utf8mb4 和 utf8:编码范围和存储空间utf8...【详细内容】
2023-05-10  T锅侠    Tags:utf8   点击:(17)  评论:(0)  加入收藏
前段时间发布了一篇linux环境的mysql备份脚本,因为linux作为数据库服务器是目前市场的主流。现应网友粉丝要求,分享一下windows环境mysql的备份脚本。备份需求 每个库单独一个...【详细内容】
2023-05-10  雪竹频道  今日头条  Tags:mysql   点击:(15)  评论:(0)  加入收藏
我们准备了索引的15连问,相信大家看完肯定会有帮助的。1. 索引是什么? 索引是一种能提高数据库查询效率的数据结构。它可以比作一本字典的目录,可以帮你快速找到对应的记录。 ...【详细内容】
2023-05-08  dbaplus社群    Tags:MySQL索引   点击:(34)  评论:(0)  加入收藏
有时候,我们可能有这样的场景,需要将销量按月统计,并且按月逐月累加。写惯了GROUP BY,按月统计倒是小case,但是逐月累加实现起来,要稍微麻烦一点。下面就整理几种写法,以备不时之...【详细内容】
2023-05-06    今日头条  Tags:MySQL   点击:(33)  评论:(0)  加入收藏
站内最新
站内热门
站内头条