本文源码:GitHub·点这里 || GitEE·点这里

一、索引简介

1、基本概念

首先要明确索引是什么:索引是一种数据结构,数据结构是计算机存储、组织数据的方式,是指相互之间存在一种或多种特定关系的数据元素的集合,例如:链表,堆栈,队列,二叉树等等。

其次要清楚索引的作用:索引可以使存储引擎快速找到数据记录,这是最基本的作用,索引是对查询速度最关键的影响,良好的索引设计可以使查询的效率有质的飞越。

索引的使用:如果查询语句使用所有,MySQL会在索引的数据结构上查询,如果查询到,就返回包含该索引的数据行。

2、索引的优点

  • 唯一或者主键索引,保证列数据的唯一性
  • 减少数据扫描量,快速查询数据;
  • 数据有序的索引,可以将随机IO变成顺序IO;
  • 有效的索引查询,可以避免排序和临时表;

3、索引分类

索引的种类非常多,如何分类取决多个场景和不同的角度,常见的划分如下:

  • 产生作用:主键索引,普通索引,非空索引,全文索引;
  • 覆盖字段:单列索引,组合索引;
  • 数据结构:B-Tree索引,哈希索引,R-Tree索引;

注意:索引的实现是在存储引擎层面,相同的索引在不同的存储引擎中,其实现方式可能都是不一样的。

二、索引用法详解

1、不同索引特点

普通索引

基本的索引,没有任何使用限制,主要用来加速数据查询。适合经常出现在查询条件或排序条件中的数据列。

主键索引

特殊的唯一索引,不允许有空值,在建表的时候指定主键,就会创建主键索引,MySQL中最核心的索引,大量的业务数据都是基于主键查询。

唯一索引

普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须是唯一性的。

全文索引

用于全文搜索,通过建立全文索引,基于分词的查询模式,可以极大的提升检索效率。

组合索引

创建的索引覆盖两个或者两个以上的列,适应组合查询的场景,也常用于要素验证的业务,例如判断用户身份ID,手机号,邮箱,是否为同一个用户。

2、管理索引语法

基础用户表

CREATE TABLE user_base (id INT (11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',user_name VARCHAR (20) NOT NULL COMMENT '用户名',phone VARCHAR (20) NOT NULL COMMENT '手机号',email VARCHAR (32) DEFAULT NULL COMMENT '邮箱',card_id VARCHAR (32) DEFAULT NULL COMMENT '身份编号',create_time datetime DEFAULT NULL COMMENT '创建时间',state INT (1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '用户基础表';

创建单列索引

CREATE INDEX card_id_index ON user_base(card_id);

修改添加索引

ALTER TABLE user_base ADD INDEX state_index(state) ;

创建组合索引

CREATE INDEX bind_index ON user_base(phone,card_id);

删除索引

DROP INDEX card_id_index ON user_base ;

修改索引

MySQL不支持真正修改索引的语法规范,可以通过删除旧索引,添加新索引的方式进行操作。

3、查询索引

分析MySQL查询,多数情况下用来分析执行语句的SQL中是否使用索引,是否产生临时表等性能相关问题。

基础用法

EXPLAIN SELECT * FROM user_base WHERE id='1';

参数说明

  • id:相同,按table列由上至下顺序执行,不同,如果是子查询,id的序号会递增,id的值越大优先级越高,越先被执行;
  • select_type:表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询;
simple:简单select查询,查询中不包含子查询或者
primary:查询中若包含复杂的子部分,最外层查询则被标记为primary
subquery:select或where中包含子查询
derived:from中包含的子查询被标记为derived衍生,mysql会递归执行这些子查询,且生成临时表
union:第二个select出现在union后,标记为union
union-result:从union表获取结果的select
  • table:指当前执行计划中的数据表;
  • type:说明的是查询使用了哪种类型,下面从好到差排序;
system-const:对查询的某部分进行优化并转换成一个常量时,会使用该类型
eq_ref:常见于主键或唯一索引扫描,表中只有一条记录与之匹配
ref:非唯一性索引扫描,返回匹配某个单独值的所有行
index:遍历索引结构,索引文件通常比数据文件小
all:遍历全表进行查询
  • possible_keys:在查询中可能使用到的索引;
  • key:在查询中实际使用到的索引;
  • key_len:查询中索引字段的最大可能长度,在不损失精确性的情况下,长度越短越好;
  • ref:表示本行被操作的对象的参照对象,可能是一个常量用const表示,也可能是其他表的key指向的对象;
  • rows:预估找到符合要求的记录所需要扫描的行数,扫描越少越好;
  • extra:执行计划中,一些十分重要的信息;
Using-Filesort:查询使用文件排序,最差的执行计划
Using-Temporary:临时表保存中间结果,比文件排序稍微强点
Using-Index:查询操作中使用了覆盖索引
Using-Where:表明使用了where过滤条件
Using-Join-Buffer:表明使用了连接缓存
Impossible-Where:表示where条件false,不能过滤元素
Distinct:优化distinct找到第一匹配的数据后即停止找同样值的动作
Select-Tables-Optimized-Away:不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化

三、B-Tree索引结构

1、B-Tree索引简介

MySQL官方比较推荐的索引结构类型,在实际的数据库开发中,基于MySQL中的表结构,大部分使用的都是B-Three索引结构,即二叉树的结构。可以加快数据的访问速度,存储引擎不再需要进行全表扫描来获取数据,数据分布在各个索引节点上,B-Tree索引结构如图:

该结构是典型的二叉树结构,特点:数据值按照顺序存储的,每个叶子节点到根部的距离是相同的,注意这里描述的是索引结构图。

实际存储结构上,数据顺序存储,每个节点包含索引值,索引指向的数据行的值,指向子页的指针,指向叶子页的指针,这样才能把索引和数据结构组织起来,结构如图:

这样完整描述B-Tree索引的数据特点,基于树搜索提升效率,减少扫描数据,数据被顺序的组织起来,按照索引值顺序排列。

2、搜索规则

索引的根本作用,减少扫描的数据量,提升查询效率,基于B-Tree索引的结构的查询规则基本如下:

  • 查询从索引的根节点开始,逐步搜索;
  • 根节点的槽中存放指向子节点的指针,指向下层;
  • 根据节点页的值和查询值比较,判断是否符合条件;
  • 不断执行上述逻辑,直到查询完成;

注意:必须要强调一点,查询必须是在执行索引的基础上,才是该逻辑,正常的开发中多分析一下查询语句,有时候可能只是自己感觉查询索引是执行的,实际可能是失效的。

3、索引查询失效

好的索引设计十分重要,但是查询的时候很可能因为触发各种索引失效机制,导致SQL语句不执行索引搜索,严重损失性能,所以基于业务下数据查询特点,设计相对好用的索引结构,是十分关键的,这里涉及很多场景问题,后续再详细记录。

四、索引导致的问题

索引有时候并不是最好的解决方式,当数据量庞大的时候,索引也会占据庞大的存储空间,这里提供一个业务测试场景,仅供参数:单表三个字符类型字段,两个字段使用索引结构,存储数据在700W量级,在A和B两个数据库,A数据库有索引结构,B数据库没有索引,A库占用的空间是B库的1.6倍,写入千万数据的速度也比B数据库慢9分钟。

这里只想说明一点:索引虽然好,使用妥当才能发挥作用。

五、源代码地址

GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

推荐阅读:MySQL系列

序号 文章标题
01 MySQL基础:经典实用查询案例,总结整理
02 MySQL基础:从五个维度出发,审视表结构设计
03 MySQL基础:系统和自定义函数总结,触发器使用详解
04 MySQL基础:存储过程和视图,用法和特性详解
05 MySQL基础:逻辑架构图解和InnoDB存储引擎详解
06 MySQL基础:事务管理,锁机制案例详解
07 MySQL基础:用户和权限管理,日志体系简介
08 MySQL进阶:基于多个维度,分析服务器性能

MySQL进阶篇(02):索引体系划分,B-Tree结构说明相关推荐

  1. MySQL进阶篇(03):合理的使用索引结构和查询

    本文源码:GitHub·点这里 || GitEE·点这里 一.高性能索引 1.查询性能问题 在MySQL使用的过程中,所谓的性能问题,在大部分的场景下都是指查询的性能,导致查询缓慢的根本原因是数据量的 ...

  2. 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器

    超详细图解![MySQL进阶篇]存储过程,视图,索引,函数,触发器 1.1 下载Linux 安装包 1.2 安装MySQL 1.3 启动 MySQL 服务 1.4 登录MySQL 2\. 索引 2.1 ...

  3. 超详细图解!【MySQL进阶篇】MySQL索引原理

    索引类型 索引可以提升查询速度,会影响where查询,以及order by排序.MySQL索引类型如下: 从索引存储结构划分:B Tree索引.Hash索引.FULLTEXT全文索引.R Tree索引 ...

  4. 黑马MySQL进阶篇笔记

    目录 MySQL进阶篇 一.存储引擎 1.1 Mysql体系结构图 1.2 存储引擎 1.概念 2.InnoDB 3.MyISAM 4.Memory 5.三种引擎对比 6.引擎的选择 1.3 安装my ...

  5. 【MySQL | 进阶篇】07、全局锁、表级锁、行级锁

    目录 一.概述 二.全局锁 2.1 介绍 A. 我们一起先来分析一下不加全局锁,可能存在的问题. B. 再来分析一下加了全局锁后的情况 2.2 语法 1). 加全局锁 2). 数据备份 3). 释放锁 ...

  6. 【MySQL进阶篇】学习笔记

    文章目录 MySQL进阶学习 前言 1.存储引擎 1.1 MySQL体系结构概览 1.2 存储引擎介绍 1.3 常见存储引擎的特点 1.3.1 InnoDB的特点 1.3.2 MyISAM 1.3.3 ...

  7. 【MySQL | 进阶篇】05、MySQL 视图、触发器讲解

    目录 一.视图 1.1 介绍 1.2 语法 1.2.1 演示示例 1.3 检查选项 1.3.1 CASCADED 级联 1.3.2 LOCAL 本地 1.3.3 示例演示 1.4 视图的更新 1.4. ...

  8. 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎

    1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理 ...

  9. 【MySQL进阶篇】一、存储引擎、索引

    文章目录 参考资料 前言 1. 存储引擎 1.1 简介 1.2 特点 1.2.1 InnoDB 1.2.2 MyISAM 1.2.3 Memory 1.2.4 小结 1.3 存储引擎选择 1.4 总结 ...

最新文章

  1. 一个原生态ajax过程,提交表单的例子
  2. linux环境下c语言的学习--linux下的基本操作
  3. 二维数组按行和按列遍历的效率
  4. 【registry】Reader schema missing default value for field: age
  5. [收藏转载]明星软件工程师的十种特质
  6. ios 安装OpenFire
  7. Gstreamer之video转码(七)
  8. 图像条纹检测 python_光源在外观缺陷检测中的应用
  9. HTML5视频教程比较好的学习教程推荐
  10. Java中new一个对象的步骤:
  11. Java无法加载主类
  12. Postgres-XL 9.5简易搭建
  13. [每日一氵]协方差矩阵计算
  14. 牛客刷题记录之语法入门选择结构篇
  15. 2.6.2 QDate类与QDateEdit控件介绍(日期处理)
  16. 二项分布 (Binomial Distribution)
  17. bootstrap按钮组btn-group
  18. 2007软件英雄会暨CSDN社区英雄榜颁奖典礼邀请人员名单
  19. 嵌入式tomcat的不使用web.xml原理分析
  20. vue——axios请求成功却进入catch的原因

热门文章

  1. Android开发:1-3、Android常用布局
  2. Linux系统编程2:基础篇之详解Linux中的权限问题
  3. 安装rpm报错:requires Ruby version >= 2.*.*
  4. distribution was not found and is required by the application错误
  5. shell获取路径文件的文件名
  6. QT 显示中文、解决发布乱码、获得系统特定目录、获取文件属性、列表控件、屏幕截图显示保存(定时器)、视频直播、右键菜单
  7. 数据结构与算法——二叉排序树详解以及代码实现
  8. 递归应用:折半查找法
  9. 2019牛客多校四 E. triples II (容斥)
  10. 简易正则表达式引擎源码阅读