一、索引概述

  1.1 索引的介绍

    索引index:是帮助 Mysql 高效获取数据 的 有序的数据结构,在数据之外,数据库系统维护着的满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引

  1.2 索引的优缺点

    • 优点1:提高数据检索的效率,降低数据库的IO成本
    • 优点2:通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗
    • 缺点1:索引列也要占磁盘空间。
    • 缺点2:索引大大提高了查询效率,同时却也降低了更新表的速度,如对表进行insert,update,delete时,效率降低

二、索引结构

  2.1 Mysql的索引常见结构

    Mysql的索引是在储存引擎层实现的,不同的存储引擎有不同的结构,主要包含一下几种 

    • B+树:最常见的索引类型,大部分引擎都支持B+树索引
    • Hash索引:底层数据结构是用哈希表实现的,只有精确匹配索引的查询才有效,不支持范围查询 

  2.2 Mysql常见索引对不同引擎的支持

    • B+树:InnoDB(支持)、MyISAM(支持)、Memory(支持)
    • Hash索引:InnoDB(不支持)、MyISAM(不支持)、memory(支持)

  2.3 二叉树实现索引的弊端

    

    说明1:实际中的索引是没有使用二叉树的,因为二叉树具有一下的弊端  

    说明2:当顺序插入时,会形成一个链表,查询性能大大降低,大数据量的情况下,层级较深,检索速度慢。

    说明3:特殊二叉树红黑树当做索引是,大数据量情况下,层级比较深,检索速度慢

  2.4 B树实现索引的弊端

    以一个最大度数(max-degree)为5(5阶)的b树为例(每个节点最多储存4个key,5个指针)

    

    说明:B树的数据会存在每个节点上,而节点存在页(2.6 Mysql索引对B+树的优化有说明)上面,每页的大小为16K,这样每个页能存放的索引就比较少,导致同样数据体积小,层级要比B+树深。

  2.5 B+树实现索引

    以一个最大度数(max-degree)为4(4阶)的b+树为例

     

    说明:对比较与B树

      1、所有的数据都会出现在叶子节点上

      2、叶子节点形成一个单向链表

  2.6 Mysql索引对B+树的优化

    Mysql索引数据结构对经典的B+树进行了优化,在原来的B+树基础上,增加了一个指向相邻叶子节点的链表指针,就行了带有顺序指针的B+树,提高了区间访问的性能

    

    说明:每页在InnoDB中默认16K

  

  2.7 hash索引

    哈希索引就是采用一定的hash算法,将键值换成新的hash值,映射到对应的槽位上,然后储存在hash表中

     

    说明:如果两个(或者多个)键映射到同一个槽位上,他们就产生了hash冲突,也称hash碰撞,可以通过链表来解决

  

  2.8 hash索引特点

    • hash索引只能用于对等比较(=,in),不支持范围查询(between,>,<)
    • 无法利用索引完成排序操作
    • 查询效率高,通常只需要一次检索就可以了,效率通常要高于B+树索引
    • 在Mysql中,支持hash索引的事Memory引擎,而InnoDB中具有自适应hash功能,hash索引是存储引擎根据B+树索引在指定条件下自动构建的

  2.9 InnoDB引擎选择B+树的优势

    • 相对于二叉树,层级更少,搜索效率高
    • 对于B树,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,同样保存大量数据,只能增加树的高度,导致性能降低。
    • 相对于hash索引,B+树支持范围匹配及排序操作

三、索引分类

  3.1 主键索引

    针对于表中主键创建的索引,默认自动创建,只能有一个, 关键字:primary

  3.2 唯一索引

    避免同一个表中某数据列中的值重复,可以有多个,关键字:unique

  3.3 常规索引

    快速定位特定数据,可以有多个,

  3.4 全文索引

    全文索引查找的是文本中的关键字,而不是比较索引中的值,可以有多个,fulltext

  3.5 聚集索引

    在InnoDB中,根据索引的储存形式划分的,将数据储存与索引放到一起,索引结构的叶子节点保存了行数据,必须有,而且只有一个

    • 如果存在主键,主键索引就是聚集索引
    • 如果不存在主键,将使用第一个唯一(unique)索引作为聚集索引
    • 如果表没有主键,也没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引

  3.6 二级索引

    在InnoDB中,根据索引的储存形式划分的,将数据与索引分开储存,索引结构的叶子节点关联的是对应的主键,可以存在多个

   

    说明:聚集索引下面存放的是整行的数据,二级索引下面存放的对应的主键,要不然聚集索引下存放了整行数据,二级索引下也放整行数据,就会很冗余

  3.7 回表查询

    

    说明1:首先根据name字段走二级索引

    说明2:找到Arm对应的id=10

    说明3:然后再根据id=10找到对应的数据

    说明4:整个过程也叫做回表查询

四、索引语法

  4.1 查看索引

show index from 表名

    示例:

mysql> show index from account;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| account | 0 | PRIMARY | 1 | id | A | 4 | NULL | NULL | | BTREE | | | YES | NULL |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.00 sec)

    说明:account 有一个主键索引

  4.2 创建索引

create [unique | fulltext] index 索引名 on 表名(索引的列名, ..); 

    说明1:如果创建索引的字段是唯一的,值都不重复,可以加unique约束,说明这是一个唯一字段索引

    说明2:fulltext 是全文检索索引,主要针对大的文本字段

mysql> create index name_idx on account(name);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from account;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| account | 0 | PRIMARY | 1 | id | A | 4 | NULL | NULL | | BTREE | | | YES | NULL |
| account | 1 | name_idx | 1 | name | A | 4 | NULL | NULL | YES | BTREE | | | YES | NULL |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
2 rows in set (0.01 sec)

    说明1:这就创建了一个名为name_idx的索引

  4.3 删除索引

drop index 索引名 on 表名

    示例

mysql> drop index name_idx on account;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from account;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| account | 0 | PRIMARY | 1 | id | A | 4 | NULL | NULL | | BTREE | | | YES | NULL |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.00 sec)

    说明:这就删除了一个索引

五、预告

  后面的文章会继续介绍索引的使用和设计原则

Mysql高级3-索引的结构和分类的更多相关文章

  1. Mysql高级之索引

    原文:Mysql高级之索引 索引:是针对数据所建立的目录. 作用: 可以加快查询速度 负面影响: 降低了增删改的速度. 索引的创建原则: 1:不要过度索引 2:在where条件最频繁的列上加.在重复度 ...

  2. SQLServer存储引擎——05.索引的结构和分类

    5. SQLServer存储引擎——索引的结构和分类 关系型数据库中以二维表来表达关系模型,表中的数据以页的形式存储在磁盘上,在SQL SERVER中,数据页是磁盘上8k的连续空间,那么,一个表的所有 ...

  3. 【MySQL 高级】索引优化分析

    MySQL高级 索引优化分析 SQL 的效率问题 出现性能下降,SQL 执行慢,执行时间长,等待时间长等情况,可能的原因有: 查询语句写的不好 索引失效 单值索引:在 user 表中给 name 属性 ...

  4. MySQL高级篇 | 索引介绍

    前言 性能下降SQL慢的原因 查询语句写的烂 索引失效 单值索引 复合索引 关联查询太多join(设计缺陷或不得已的需求) 服务器调优及各个参数设置(缓冲.线程数等) 索引是什么 MySQL官方对索引 ...

  5. mysql高级、索引

    一.mysql高级 1.视图 # 引子 select * from emp left join dep on emp.dep_id = dep.id union select * from emp r ...

  6. SQL Server 查询优化 索引的结构与分类

    一.索引的结构 关系型数据库中以二维表来表达关系模型,表中的数据以页的形式存储在磁盘上,在SQL SERVER中,数据页是磁盘上8k的连续空间,那么,一个表的所有数据页在磁盘上是如何组织的呢?分两种情 ...

  7. mysql 高级和 索引优化,目的:查的好,查的快,性能好

    1-事物隔离级别: 更新丢失, 并发情况下,对同一字段进行更新,就会出现更新丢失,采用乐观锁,比较版本号或时间戳可解决 读未提交 解决了更新丢失但是会引起脏读, 二个session.sessionA中 ...

  8. Mysql高级操作学习笔记:索引结构、树的区别、索引优缺点、创建索引原则(我们对哪种数据创建索引)、索引分类、Sql性能分析、索引使用、索引失效、索引设计原则

    Mysql高级操作 索引概述: 索引是高效获取数据的数据结构 索引结构: B+Tree() Hash(不支持范围查询,精准匹配效率极高) 树的区别: 二叉树:可能产生不平衡,顺序数据可能会出现链表结构 ...

  9. MySQL高级优化

    MySQL高级 1.索引是什么? (1)索引是排好序可以快速查找的数据结构 (2)方便快速查找,索引实际上也是一张表所以也是要占内存的 2.索引存在哪里? (1)InnoDB引擎 ①索引是和数据存放在 ...

  10. MySQL高级知识(三)——索引

    前言:索引在sql调优部分占据着重要的位置,了解并深入索引对我们来说也是非常重要的.本篇主要介绍MySQL中索引的相关知识点. 1.索引是什么 MySQL官方对索引的定义:索引(Index)是帮助My ...

随机推荐

  1. 视频会议中的AEC、AGC、ANS是什么?

    视频会议中的AEC.AGC.ANS是什么? 1.AGC是自动增益补偿功能(Automatic Gain Control),AGC可以自动调麦克风的收音量,使与会者收到一定的音量水平,不会因发言者与麦克 ...

  2. 虚拟机中Docker下部署gitlab

    一.安装Gitlab 1.拉取镜像并启动 由于服务器的80端口可能被占用,所以这里我们改成了其他端口来启动 docker run -d -p 2443:443 -p 5678:80 -p 2222:2 ...

  3. 2022-04-26:给定四个整数 sx , sy ,tx 和 ty,如果通过一系列的转换可以从起点 (sx, sy) 到达终点 (tx, ty),则返回 true,否则返回 false。 从点 (x

    2022-04-26:给定四个整数 sx , sy ,tx 和 ty,如果通过一系列的转换可以从起点 (sx, sy) 到达终点 (tx, ty),则返回 true,否则返回 false. 从点 (x ...

  4. (偶尔更新)【Linux】Linux常见不常用命令收集

    本文时间 2023-05-20 作者:sugerqube漆瓷 cd,vi,clear这些属于常见常用命令本文不再赘述. 安装命令 yum install vim举例安装vim rpm -ivh a.r ...

  5. 理论+实操,带你了解多沙箱容器运行时Kuasar

    摘要:华为云DTSE技术布道师张天阳结合沙箱容器发展历程,介绍华为云多沙箱容器运行时 Kuasar 项目优势,开启多沙箱容器运行时上手实践体验. 本文分享自华为云社区<理论+实操,带你了解多沙箱 ...

  6. ENVI手动地理配准栅格图像的方法

      本文介绍在ENVI软件中,手动划定地面控制点从而实现栅格图像相互间地理配准的方法:其中,所用软件版本为ENVI Classic 5.3 (64-bit).   首先,在软件中同时打开两景需要进行地 ...

  7. Linux 目录 查看 压缩 编辑 命令

    目录 一.文件目录 二.查看文件 三.压缩与解压 四.vim编辑 一.文件目录结构 文件类型: /root 管理员的家目录 /home 用户家目录 /bin   命令文件目录,存放命令,管理员和用户可 ...

  8. 火爆,Github标星240K的编程学习路线图,适合所有程序员!

    推荐一个涵盖开发.运维.产品设计的学习路线图,在Github已经start超过240K,包括各门编程语言! 一.涵盖的路线图 该项目涵盖了非常全面的学习路线图: 前端路线图 后端路线图 ASP.NET ...

  9. 适用于Linux命令的10个R函数

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 这篇文章将介绍 10 个不同的 Linux 命令及其 R 实现方法. 如果您有兴趣学习更多 R ...

  10. C# 客户端程序 Visual Studio 远程调试方法

    传统桌面客户端的远程调试相比UWP,ASP等项目来说,配置比较麻烦,因为它是非部署的应用程序,原理是复制编译的文件到远程计算机,通过网络来连接和VS的通信,本文主要讲述WPF,WinForm应用程序的 ...