数据库进阶教学——索引

目录

一、索引概述

1、介绍

2、演示

3、优缺点

二、索引结构

1、B+树

2、Hash

三、索引分类 

四、索引语法

1、语法

2、示例

五、SQL性能分析

1、SQL执行频率

2、慢查询日志

3、profile详情

4、explain执行计划

六、索引使用

七、索引设计原则


一、索引概述

1、介绍

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

2、演示

  • 无索引
    • 假设,要从下表中查找age=45的人。
      • 数据库会从头开始遍历这张表,直到扫描完毕,找出所有age=45的人。(全表扫描
  • 有索引
    • 以二叉树为例,构建一个索引,继续查找age=45的人。
      • 数据库只需要进行二叉树查找,找到age=45结点指向的数据即可。(只需要查找三次)
    • 【注】上述二叉树索引结构的只是一个示意图,并不是真实的索引结构。

3、优缺点

  • 优点缺点
    提高数据检索的效率,降低数据库的IO成本。索引列也是要占用空间的。
    通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE时,效率降低。

二、索引结构

  • MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:
    • B+Tree索引:最常见的索引类型,大部分引擎都支持B+树索引。
    • Hash索引:底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效不支持范围查询。
    • R-tree(空间索引):空间索引是MylSAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少。
    • Full-text(全文索引):是一种通过建立倒排索引,快速匹配文档的方式。类似于Lucene,Solr,ES。

1、B+树

  • 以一颗最大度数为4(4阶)的B+树为例:
  • 特点:
    • 非叶子结点只起索引作用,叶子结点才是用来存放数据的。
    • 叶子结点形成了一个单向链表。
  • MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。
  • 使用B+树的优势:
    • 相对于二叉树,层级更少,搜索效率高。
    • 对于B树,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低。
    • 相对Hash索引,B+树支持范围匹配及排序操作。

2、Hash

  • 哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。
  • 如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。
  • 特点:
    • Hash索引只能用于对等比较(=),不支持范围查询(<、>)。
    • 无法利用索引完成排序操作。
    • 查询效率高,通常只需要一次检索就可以了,效率通常要高于B+tree索引。

三、索引分类 

  • 分类含义特点关键字
    主键索引针对于表中主键创建的索引默认自动创建,只能有一个PRIMARY
    唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE
    常规索引快速定位特定数据可以有多个
    全文索引全文索引查找的是文本中的关键词,而不是比较索引中的值可以有多个FULLTEXT
  • 在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
    • 分类含义特点
      聚集索引将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据必须有,而且只有一个
      二级索引将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键可以存在多个
    • 聚集索引选取规则:
      • 如果存在主键,主键索引就是聚集索引。
      • 如果不存在主键,将使用第一个唯一(UNIQUE)索引为聚集索引。
      • 如果表没有主键,或没有合适的唯一索引,则innoDB会自动生成一个rowid作为隐藏的聚集索引。
  • 聚集索引和二级索引
  • 聚集索引和二级索引如何进行查询?
    • 先在二级索引查询到Arm的id,再在聚集索引中利用id查询到其所有信息。
    • 利用id查询比利用name查询速度更快,因为name查询需要回表查询。

四、索引语法

1、语法

  • 创建索引
    • CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name(index_col_name, ... );
      /* UNIQUE表示唯一索引,FULLTEXT表示全文索引,不加表示创建一个常规索引 */
      /* index_name索引名 */
      /* table_name表名 */
      /* index_col_name关联的字段名 */
  • 查看索引
    • SHOW INDEX FROM table name;
      或
      SHOW INDEX FROM table name\G;  /* 按列展示 */
  • 删除索引
    • DROP INDEX index_name ON table_name;

2、示例

  • 现有一张数据表account。
  • 查看account表中的索引。
  • 为account表中的name字段创建索引。(常规索引)
    • 再次查看索引。
  • 为account表中的phone字段创建唯一索引。
    • 再次查看索引。
  • 删除索引。

五、SQL性能分析

  • 数据库主要针对select查询语句进行优化,所以索引的优化占据了主导地位。下面讲解了四种SQL语句性能分析的工具。

1、SQL执行频率

  • MySQL客户端连接成功后,通过show [session | global] status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次。
    • SHOW GLOBAL STATUS LIKE 'Com_______';  /* 7个下划线 */
    •  
    • 删除、插入、查询和更新的次数是多少。
  • 当一个数据库是以查询为主时,就需要进行优化了。

2、慢查询日志

  • 具体需要针对哪些select语句进行优化,可以利用数据库的慢查询日志来定位执行效率低的SQL语句。
  • 慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。
  • MySQL的慢查询日志默认没有开启,需要手动开启。
    • /* 开启慢日志 */
      SET GLOBAL slow_query_log = ON;
      /* 设置超时时间 */
      SET GLOBAL long_query_time = 0.001;
  • 查看慢查询日志是否开启,和存放慢日志的文件。
    • show variables like 'slow_query%';
  • 查看所设置的超时时间。
    • show variables like 'long_query%';
  • 当查询时间超过所设定的时间时,慢查询日志会记录本次查询操作。
    • 一般日志文件存放在如下位置,可直接以文本形式打开。

3、profile详情

  • 慢查询日志只会记录执行时间超过了预设超时时间的操作。例如,预测超时时间为2s,那么1.8s的操作就不会被记录。
  • 如果一个数据库比较简单,其操作大多数都是1.8s左右,那这些操作性能也相对比较低。此时慢查询日志就不太合适了,可以借助profile详情。
  • show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MySQL是否支持profile操作。
    • select @@have_profiling;
  • 默认profiling是关闭的,可以通过set语句在session/global级别开启profiling。
    • set profiling = 1;
    • 查看是否开启。
      • select @@profiling;
  • 执行一系列的SQL的操作,然后通过如下指令查看指令的执行耗时:
    • /* 查看每一条SQL的耗时基本情况 */
      show profiles;
      /* 查看指定query_id的SQL语句各个阶段的耗时情况 */
      show profile for query query_id;
      /* 查看指定query_id的SQL语句CPU的使用情况 */
      show profile cpu for query query_id;
    • 查看每条指令的耗时情况。
    • 查看指定query_id的SQL语句各个阶段的耗时情况。
    • 查看指定query_id的SQL语句CPU的使用情况。  

4、explain执行计划

  • 前三种工具都是从时间层面来判断SQL语句的执行性能,而能更加精确地分析SQL语句性能的是explain执行计划。
  • EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。
    • /* 直接在select语句之前加上关键字explain/desc */
      EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;
  • explain执行计划各字段含义:
    • id
      • select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)。
    • select_type
      • 表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)等。
    • type
      • 表示连接类型,性能由好到差的连接类型为NULL、system、const、eq_ref、ref、range、index、all。
    • possible_key
      • 显示可能应用在这张表上的索引,一个或多个。
    • Key
      • 实际使用的索引,如果为NULL,则没有使用索引。
    • Key_len
      • 表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好。
    • rows
      • MySOL认为必须要执行查询的行数,在innodB引擎的表中,是一个估计值,可能并不总是准确的。
    • filtered
      • 表示返回结果的行数占需读取行数的百分比,filtered的值越大越好。

六、索引使用

  • 在未建立索引之前,执行如下SQL语句,查看SQL的耗时。
    • SELECT* FROM 表名 WHERE 字段 = value;
  • 针对字段创建索引
    • create index 索引名 on 表名(字段); 
  • 然后再次执行相同的SQL语句,再次查看SOL的耗时。

七、索引设计原则

  • 针对于数据量较大,且查询比较频繁的表建立索引。
  • 针对于常作为查询条件 (where)、排序 (order by)、分组(group by) 操作的字段建立索引。
  • 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
  • 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
  • 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
  • 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
  • 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/149283.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【文件包含】metinfo 5.0.4 文件包含漏洞复现

1.1漏洞描述 漏洞编号————漏洞类型文件包含漏洞等级⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐漏洞环境windows攻击方式 MetInfo 是一套使用PHP 和MySQL 开发的内容管理系统。MetInfo 5.0.4 版本中的 /metinfo_5.0.4/about/index.php?fmodule文件存在任意文件包含漏洞。攻击者可利用漏洞读取网…

分享篇:我用数据分析做副业

主业是数据分析专家&#xff0c;副业是数据咨询顾问&#xff0c;过去十年里面利用数据分析发家致富 人生苦短&#xff0c;我学Python&#xff01; 利用技能可以解决的问题&#xff0c;哪些场景下可以催生出需求&#xff0c;深度剖析数据分析的技能树 由浅入深&#xff0c;一个…

Neo4j数据库介绍及简单使用

图数据库介绍 图数据库是一种专门设计用于存储和管理图形数据的数据库类型。在图数据库中&#xff0c;数据以图的形式表示&#xff0c;其中节点表示实体&#xff0c;边表示实体之间的关系。这种表示方式非常适合处理具有复杂关系的数据&#xff0c;如社交网络、推荐系统、网络…

点成分享丨如何提高旋转蒸发仪的蒸馏提纯效率

旋转蒸发仪&#xff1a; 主要用于医药、化工和制药等行业的浓缩、结晶、干燥、分离及溶媒回收。其原理为在真空条件下&#xff0c;恒温加热&#xff0c;使旋转瓶恒速旋转&#xff0c;物料在瓶壁形成大面积薄膜&#xff0c;高效蒸发。溶媒蒸气经高效玻璃冷凝器冷却&#xff0c;…

除了Excel中可以添加公式之外,在Word中也可以添加公式,不过都是基于表格

公式是必不可少的,因为它们有助于简化任何数学任务。微软的应用程序中有许多数学公式。微软应用程序之一的Word配备了一个公式功能,可以执行各种操作。本文将讨论如何在Word中使用和添加公式。 在Word中,公式主要用于表格。因此,你需要有一个表格才能在Word中使用公式。 …

2023年阿里云服务器购买指南,优惠云服务器性能说明

云服务器作为当下互联网行业的重要基础设施之一&#xff0c;对于个人博客、企业展示型官网以及开发者来说&#xff0c;是必不可少的工具。2023年&#xff0c;阿里云金秋云创季推出了两款特惠的云服务器&#xff0c;为用户提供了更加优惠和实用的选择。 1. 轻量应用服务器2核2G…

3D建模基础教程:编辑样条线【总层级】

在本期的3D建模基础教程中&#xff0c;我们将探讨“编辑样条线”的【总层级】。我们将从以下几个方面进行深入分析&#xff1a; 1️⃣ 理解“编辑样条线”的层级结构 在3D建模中&#xff0c;“编辑样条线”是一个非常重要的环节。它主要涉及到曲线的创建、修改和调整。通过学习…

基于卷积神经网络的猫种类的识别

1.介绍 图像分类是计算机视觉中的一个关键任务&#xff0c;而猫种类识别作为一个有趣且实用的应用场景&#xff0c;通过卷积神经网络&#xff08;CNN&#xff09;的模型能够识别猫的不同品种。在这篇博客中&#xff0c;将详细介绍如何利用深度学习技术构建模型&#xff0c;从而…

100G.的DDoS高防够用吗?

很多人以为100G的DDoS防御已经足够了&#xff0c;但殊不知DDoS攻击大小也是需要分行业类型的&#xff0c;比如游戏、金融、影视、电商甚至ZF或者行业龙头等等行业类型&#xff0c;都是大型DDoS攻击的重灾区&#xff0c;别说100G防御&#xff0c;就算300G防御服务器也不一定够用…

基于SpringBoot+Vue的在线外卖管理系统

基于SpringBootVue的在线外卖管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 下单界面 登录界面 商家界面 摘要 本文介绍了一种基于Spring Boot和…

如何用SaleSmartly集成WhatsApp账号(内含WhatsApp个人号、商业号、API号对比图)

用SaleSmartly集成WhatsApp账号 如果企业有多个WhatsApp账号&#xff0c;无论是个人账号还是工作账号&#xff0c;员工操作起来可能会觉得难以管理和切换。SaleSmartly就可以解决这个问题&#xff0c;让员工在一个平台上同时使用多个WhatsApp账号&#xff0c;不需要频繁地登录和…

ubuntu22.04下hadoop3.3.6+hbase2.5.6+phoenix5.1.3开发环境搭建

一、涉及软件包资源清单 1、java 这里使用的是openjdk 2、hadoop-3.3.6.tar.gz 3、hbase-2.5.6-hadoop3-bin.tar.gz 4、phoenix-hbase-2.5-5.13-bin.tar.gz 5、apache-zookeeper-3.8.3-bin.tar.gz 6、openssl-3.0.12.tar.gz 二、安装 1、操作系统环境准备 换源 sudo vim /et…

图识单链表

CSDN主页&#xff1a;醋溜马桶圈_C语言进阶,初始C语言,数据结构-CSDN博客 Gitee主页&#xff1a;mnxcc (mnxcc) - Gitee.com 专栏&#xff1a;数据结构_醋溜马桶圈的博客-CSDN博客 我们之前学习了顺序表的有关知识&#xff0c;顺序表存在下面的问题&#xff1a; 尾插效率还不错…

Ubuntu18.04平台下Qt开发程序打包的一些问题总结

目录 前言 一、在Ubuntu18.04开发环境下打包有两种方式 1、利用linuxdeployqt软件进行打包 2、利用编写shell脚本的方式进行打包 二、详细介绍shell脚本打包的方式 1、新建一个空的文件夹 2、准备脚本copylib.sh 3、准备脚本xxxx.sh。 4、给上述两个脚本添加可执行权限…

ResNet 原论文及原作者讲解

ResNet 论文摘要1. 引入2. 相关工作残差表示快捷连接 3. 深度残差学习3.1. 残差学习3.2. 快捷恒等映射3.3. 网络体系结构普通网络 plain network残差网络 residual network 3.4. 实施 4. 实验4.1. ImageNet分类普通的网络 plain network残差网络 residual network恒等vs.快捷连…

上位机模块之圆形测量,基于halcon的二次开发

夸克网盘可自取。链接&#xff1a;https://pan.quark.cn/s/ac192950e051 //在此之前可以先浏览2篇博客&#xff0c;分别是序列化与反序列化和ROI绘制获取 https://blog.csdn.net/m0_51559565/article/details/134422834 //序列化与反序列化 https://blog.csdn.net/m0_51559565…

创新升级!Coremail邮箱客户端4.0发布

11月8日&#xff0c;2023年世界互联网大会乌镇峰会盛大开幕&#xff0c;同日&#xff0c;“互联网之光”博览会新产品新技术发布&#xff08;网络安全专场&#xff09;活动在乌镇互联网国际会展中心B2馆顺利举办&#xff0c;Coremail亮相发布现场&#xff0c;重磅发布Coremail邮…

SDL2 播放音频数据(PCM)

1.简介 这里以常用的视频原始数据PCM数据为例&#xff0c;展示音频的播放。 SDL播放音频的流程如下&#xff1a; 初始化音频子系统&#xff1a;SDL_Init()。设置音频参数&#xff1a;SDL_AudioSpec。设置回调函数&#xff1a;SDL_AudioCallback。打开音频设备&#xff1a;SD…

【解决方案】危化品厂区安防系统EasyCVR+AI智能监控

危化品属于危险、易燃易爆、易中毒行类&#xff0c;一旦在生产运输过程中发生泄漏后果不堪想象&#xff0c;所以危化品的生产储存更需要严密、精细的监控&#xff0c;来保障危化品的安全。EasyCVRTSINGSEE青犀AI智能分析网关搭建的危化品智能监控方案就能很好的为危化品监管保驾…

遍历一个对象,并得出所对应的值

var dates {//定义的对象year:now.getFullYear(),month:now.getMonth()1,date:now.getDate(),hour:now.getHours(),minute:now.getMinutes(),second:now.getSeconds() }//开始遍历循环 var val; for (val in dates){console.log(对象名称&#xff1a;val-对象的值&#xff1a;…