返回顶部
首页 > 资讯 > 数据库 >MySQL索引基础
  • 739
分享到

MySQL索引基础

2024-04-02 19:04:59 739人浏览 八月长安
摘要

介绍     索引用于加快数据访问的速度。把计算机的磁盘比作一本字典,索引就是字段的目录,当我们想快速查到某个词语的时候只需要通过查询目录找到词语所在的页数,然后直接打开某页就可以。Mysql最常用的索引是

介绍

    索引用于加快数据访问的速度。把计算机的磁盘比作一本字典,索引就是字段的目录,当我们想快速查到某个词语的时候只需要通过查询目录找到词语所在的页数,然后直接打开某页就可以。Mysql最常用的索引是B+树索引,为什么使用B+作为mysql的索引,这是许多面试官必问的问题。

<!-- more -->

为什么B+树

硬件相关知识

    计算机的磁盘是一个圆盘的接口,圆盘上有一个个的圆圈,数据就是记录在这些圆圈的扇区上。如下图所示
MySQL索引基础
当计算机系统读取数据的时候要通过以下几个步骤:
1、首先移动臂根据柱面号使磁头移动到所需要的柱面上,这一过程被称为寻道。所耗费的时间叫寻道时间(ts)。
2、目标扇区旋转到磁头下,这个过程耗费的时间叫旋转时间。
    因此访问磁盘的时间由三部分构成: 寻道时间+旋转时间+数据传输时间
第一部分寻道时间延迟最高,最大可达到100ms,旋转时间取决于磁盘的转速,转速在7200转/分钟的磁盘平均旋转时间在5ms左右。磁盘的读取是以block(盘块)为单位的,位于同一个盘块的数据可以一次性读取出来。在读写数据的时候尽量减少磁头来回移动的次数,避免过多的查找时间。如果每次从磁盘上读取数据的时候都要经历上面的几个过程那么效率上无疑是极低的。

为什么B+树

    从上面可以看到,如果随机访问磁盘的速度是很慢的,因此需要设计一个合理的数据结构来减少随机访问磁盘的次数。B树就是这样一种数据结构。

B树、B+树介绍

B树

    B树是为存储设备而设计的一种多叉平衡查找树。它与红黑树类似,但是在降低io操作方面B树的表现要更好一些,B树与红黑树最大的区别在于B树可以有多个子节点,红黑树最多是有两个子节点,这就决定了大多数情况下B树的高度要比红黑树低很多,因此在查找的时候能够降低IO次数。下图是一棵B树:
MySQL索引基础
B 树又叫平衡多路查找树。一棵m阶的B树的特性如下:
    a.树中每个结点最多含有m个孩子(m>=2);
    b.除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子(其中ceil(x)是一个取上限的函数);
    c.若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点);
    d.所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息
    e.每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:
        a) Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。
        b) Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。
        c) 关键字的个数n必须满足: [ceil(m / 2)-1]<= n <= m-1。
    B树中的每个节点都尽可能存储多的关键字信息和分支信息,但是不会超过磁盘块的大小。这样在有效降低了树的高度,在查找的时候可以快速定位在指定的磁盘块。假如要从上图中找到79这个数字,首先从根节点开始扫描,79大于35所以选择P3指针,指向磁盘块4,在磁盘块4中79在65和87之间,因此选择P2指针,选择磁盘块10,这时候就可以从磁盘块10中找到79。整个过程只需要3次IO,如果这棵树被缓存在内存中,那么只需要一次IO就可以读到79这个数字。

B+树

    B+树是B的变种,一颗m阶B+树和m阶B树的异同点在于:
    1、有n棵子树的节点中有n-1个关键字(与B树n棵子树有n-1个关键字,保持一致)
    2、所有的叶子节点中包含了全部的关键字的信息,以及指向含有这些关键字记录的指针,且叶子节点本身依关键字的大小而自小而大顺序链接(而B树的叶子节点并没有包含全部需要查找的信息)
    3、所有的非终端节点可以看成索引部分,节点中仅含有其子树根节点中最大或者最小的关键字(而B树的非终节点也要包含需要查找的有效信息)
    MySQL索引基础
由于B+树的叶子节点是连接在一起的,因此相对于使用B树作为索引,对于Mysql的范围查询更加优化。同时由于叶子节点包含所有关键字信息,因此有的查询语句就不需要回表,只需要查询索引就可以查到需要的数据。

索引类型

B树索引

    虽然是叫B树索引,但是数据库实际上使用的是B+树来组织数据。B树索引意味着所有值都是按照顺序存储的,并且每个叶子节点到根节点的距离是相同的。
假如有如下数据表:

CREATE TABLE `people` (
  `last_name` varchar(50) DEFAULT NULL,
  `first_name` varchar(50) DEFAULT NULL,
  `dob` date DEFAULT NULL,
  `gender` enum('m','f') DEFAULT NULL,
  KEY `last_name` (`last_name`,`first_name`,`dob`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

该表对last_name,first_name,dob三列建立了索引,索引的组织方式如下:
MySQL索引基础
当同时对多列进行索引的时候,索引的顺序是非常重要的,上面的索引首先是按照last_name进行索引,在last_name相同的情况下在对first_name进行排序,最后是dob字段。
    B树索引适用于全键值、键值范围和最左前缀查找:
全键值
    查找名字为Allen Kim,出生日期为1930-07-12的人,这样的查找方式匹配了索引中的所有字段,依次扫描索引中的last_name、first_name和dob字段,找到对应的数据。
键值范围
    查找姓名在Allen和Barrymore之间的人,这种查找方式也会使用到索引。需要注意的是这里只能是索引中的第一列,也就是last_name的范围查找。
前缀匹配
    查找last_name是以Al开头的人,这种查询会以此扫描索引中的节点,然后选出来对应的复合条件的行。也是只能使用第一列的前缀查询。如果是说想查first_name的前缀匹配,那么是无法使用到索引的,意味着要进行全表扫描。
精确匹配某一列,范围批量另外一列
    精确匹配的列必须是所以中的第一列,范围匹配的列是第二列,这样才能使用到上面的索引。

B树索引的使用限制:
1、不是按照最左列开始查询的,无法使用索引。
2、不能跳过索引的列进行查询。
3、如果使用到了范围匹配,那么范围匹配右边的列都无法使用索引查询。
###哈希索引
    哈希索引使用哈希表来实现,只有是精确匹配的时候才会生效。存储引擎会对索引列计算出一个哈希值,然后保存一个哈希值到行数据的指针。哈希索引由于其特殊的组织方式,限制了其使用场景。哈希索引只适合值比较少的情况,例如枚举类型。在以下几种方式中是不适合使用哈希索引的:
1、哈希索引只包含哈希值和指针,不存储字段值,因此使用哈希索引避免不了要进行回表查询。
2、哈希索引数据并不是按照值的顺序进行排序的,因此哈希索引无法用来排序
3、哈希索引不支持部分索引列匹配。比如说在(A,B)两列上简历哈希索引,那么只有在同时使用A、B两列查询的时候才会使用哈希索引,只使用A列查询无法使用哈希索引。
4、哈希索引只支持等值比较,不支持像between and这种范围查询。
5、使用哈希索引的时候应该尽量避免哈希冲突。

后记

    数据库的索引机制解决的问题是在访问内存数据与磁盘数据的速度差别很大的情况下,如何快速访问数据的问题。只有了解了索引的原理才可以更好的设计表的索引字段以及写出性能更优的查询语句。在我们写SQL语句的时候头脑中应该大体上能规划出查询数据以及如何使用索引的过程。下一篇会介绍一下高性能索引的策略,带你设计出更优的索引。


欢迎关注我的微信公众号:yunxi-talk,分享Java干货,进阶Java程序员必备。
MySQL索引基础

您可能感兴趣的文档:

--结束END--

本文标题: MySQL索引基础

本文链接: https://lsjlt.com/news/50870.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL索引基础
    介绍     索引用于加快数据访问的速度。把计算机的磁盘比作一本字典,索引就是字段的目录,当我们想快速查到某个词语的时候只需要通过查询目录找到词语所在的页数,然后直接打开某页就可以。MySQL最常用的索引是...
    99+
    2024-04-02
  • mysql基础(九) 索引和视图
    索引:是一种按照特定存储格式存储的特殊数据,用于SQL查询 索引的类型:     聚集索引和非聚集索引:数据是否和索引存储在一起   主键索引和辅...
    99+
    2024-04-02
  • MySQL基础(六)-索引(index)详解
    目录 一、什么是索引? 二、索引的实现原理 三、在MySQL中,主键、unique字段上会自动添加索引。 四、索引的创建与删除 创建索引: 删除索引: 五、查看SQL语句是否使用了索引 六、索引的失效 失效的第一种情况:模糊匹配当中以“%”...
    99+
    2023-09-01
    sql 数据库
  • MySQL中索引基础知识及使用规则
    目录 一.InnoDB索引 二.B+树 三.聚集索引和辅助索引 四.索引实战 五.索引操作与规则 重建索引 索引覆盖 最左前缀原则 索引下推 用索引和用索引快速定位却别 六.普通索引和唯一索引如何选择 前提 普通索引和唯一...
    99+
    2020-03-29
    MySQL中索引基础知识及使用规则
  • MySQL与PHP的基础与应用专题之索引
    概述 从今天开始, 小白我将带领大家一起来补充一下 数据库的知识. 索引 索引 (Index) 是一种特殊的数据结构, 类似于图书的目录. 索引能够极大的提升数据库的查询效率. 如...
    99+
    2024-04-02
  • 【MongoDB】03、MongoDB索引及分片基础
    一、MongoDB配置     mongodb配置文件/etc/mongodb.conf中的配置项,其实都是mongod启动选项(和memcached一样)[root@Node...
    99+
    2024-04-02
  • 快速入门MySQL数据库索引的基础知识
    本文主要给大家介绍快速入门MySQL数据库索引的基础知识,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下快速入门MySQL数据库索引的基础知识吧。--...
    99+
    2024-04-02
  • Mysql索引基本原理
      1.Mysql表空间、段、区、页     在讲索引的概念之前我们先说一下mysql中段区页的概念。     表空间是Mysql数据库存储的最高层,默认情况下InnoDB引擎只有一个表空间,所有的数据都是存放在这个表空间内。  ...
    99+
    2017-03-31
    Mysql索引基本原理
  • 数据库学习之八:mysql 基础优化-索引管理
    八、mysql 基础优化-索引管理 1、课程大纲 索引介绍 索引管理 2、执行计划获取及分析 mysql数据库中索引的类型介绍 BTREE:B+树索引 (主要) HASH:HASH索引 FULLTEXT:全文索引 RTREE:R树...
    99+
    2016-09-20
    数据库学习之八:mysql 基础优化-索引管理
  • Mysql数据库索引面试题(程序员基础技能)
    目录引言索引原理1、数据页2、页目录3、索引原理分析总结引言 索引是Mysql的一块硬骨头,但是对于程序猿来说又是十分重要的基础技能。在平常的项目开发中,它是重要的SQL优化手段。在...
    99+
    2024-04-02
  • MySQL索引的基本语法
         索引是排好序的数据结构!可以用在 where 条件查找的字段,和order by 排序的字段,有了索引,便可以快速地定位数据所在的物理地址并找出来。 索引的...
    99+
    2022-05-26
    MySQL 索引 MySQL 索引语法
  • MYSQL索引的基本概念
    本篇内容介绍了“MYSQL索引的基本概念”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! &nbs...
    99+
    2024-04-02
  • MySQL存储引擎基础知识
    在之前的文章中我们说过MySQL事务,现在大家都应该知道了MySQL事务了吧,还记得事务的ACID原则吗?不记得的童鞋可以回顾一下《MySQL之事务初识》,其实呀,更严谨一点的话,应该是MySQL Inno...
    99+
    2024-04-02
  • Mysql数据库理论基础之四 --- 表和索引的管理
     一、简介由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点:1、是一种数据库管理系统2、是一种关联数据库管理系统3、是一种开放源码软件,且有大量可用的共享MySQL软件...
    99+
    2024-04-02
  • [MySQL]ANALYZE TABLE 更新索引基数
    MySQL使用存储的键分布基数来确定表连接顺序在决定对查询中的特定表使用哪些索引时,也会使用使用键分布基数 ANALYZE TABLE 表名 可以更新表的索引基数,使其更接近非重复的记录数,记录数可以使用show index fr...
    99+
    2020-02-08
    [MySQL]ANALYZE TABLE 更新索引基数
  • SQL 基础之索引、闪回、临时表(十八)
    创建索引:自动– 创建 PRIMARY KEY– 创建 UNIQUE KEY手动– CREATE INDEX 语句– CREATE TABLE 语句create table  语句中 create...
    99+
    2024-04-02
  • python基础知识之索引与切片详解
    目录基本索引嵌套索引切片numpy.array 索引 一维numpy.array 索引 二维pandas Series 索引pandas DataFrame 索引填坑总结基本索引 I...
    99+
    2024-04-02
  • SQLServer索引设计基础知识详解使用
    目录一、前言二、索引设计背景知识2.1、索引设计策略包括的任务三、常规索引设计3.1、数据库注意事项3.2、查询注意事项3.3、列注意事项3.4、索引的特征3.5、索引排序顺序设计指...
    99+
    2023-05-14
    SQL Server索引设计 SQL索引设计
  • 了解PHP HTTP接口索引的基础知识。
    PHP是一种流行的编程语言,被广泛应用于Web开发。HTTP接口是开发Web应用程序的重要组成部分。在这篇文章中,我们将介绍PHP HTTP接口索引的基础知识,并提供一些演示代码。 HTTP接口是一种允许不同应用程序之间进行通信的协议。在W...
    99+
    2023-08-12
    http 接口 索引
  • C++基础算法基于哈希表的索引堆变形
    目录问题来源问题简述问题分析代码展示问题来源 此题来自于Hackerrank中的QHEAP1问题,考查了对堆结构的充分理解。成功完成此题,对最大堆或者最小堆的基本操作实现就没什么太大...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作