MySQL进阶篇之MySQL索引

news/2024/4/26 6:56:21/文章来源:https://blog.csdn.net/nuist_NJUPT/article/details/129151105

今天主要学习MySQL索引,不过主要是使用Linux系统使用MySQL,主要是先在Linux环境下按照MySQL,然后演示索引的相关操作,介绍了索引的底层结构,索引的分类及语法,索引的性能分析,索引的使用规则,索引的设计原则等。

目录

1、索引概述

2、索引结构

3、索引分类

4、索引语法

5、SQL性能分析

6、索引使用

7、索引设计原则


Linux上安装MySQL这个参考具体的安装方法即可,安装完成并启动MyQL即可,就可以使用可视化管理工具连接远程的MySQL。

1、索引概述

无索引,全表扫描,有索引,可以快速检索。

 索引的优缺点:

2、索引结构

在不同的存储引擎中,MySQL索引有不同的结构,如下:

我们一般说的索引结构就是指的B+树的结构,三种存储引擎都支持B+树的结构,Memory支持Hash索引,MyISAM支持空间索引和全文索引。

我们先来看一下二排序叉树,可能出现在极端情况下退化为链表的问题,检索性能低,可以使用红黑树是一个近似的平衡二叉树,可以提高检索速度,但是性能还是不够。

 在看B+树之前,我们先看一下B树,B树的阶数就是指针数,每个节点最多存储(度数-1)个key,如果超出节点就要发生裂变,每次使得指针左侧的元素比根节点下,指针右侧的元素比根节点大。每次插入元素,当大于相应的阶数的时候,中间元素相上裂变。

B+树和B树不同,B+树所有节点都会出现在叶子节点,叶子节点以链表的形式链接在一起,非叶子节点只是起到索引数据的作用,每次插入元素达到相应的度数就会相上裂变,只不过会在叶子节点保留相应的裂变节点,并用指针链接起来,数据存储在叶子节点。

我们看一下MySQL中索引中的B+树结构,是在原来的B+树基础之上 增加了指向相邻叶子节点的指针,提高访问性能。

 

我们再看一下Hash索引,将key转化城hash值,映射到具体的位置上,然后存储到hash表就可以,若出现hash冲突,通过链表解决,直接该位置的链表尾部追加元素即可。

我们看一下hash索引的特点:支持等值比较,不支持范围查询,无序,一般来说检索效率高。出现hash碰撞的话,还要检索链表,效率也不一定高。

最后我们看一个面试题:为什么InnoDB引擎选用B+树索引,而不是二叉树,或者红黑树,B树呢?

3、索引分类

我们看一下索引的分类,主要包括四类:主键,唯一,常规,全文。

这也是面试常问的在InnoDB中,根据索引的存储形式可以分为聚集索引和非聚集索引,其中聚集索引将数据存储与索引放到一块,索引结构的叶子节点保存了行数据;非聚集索引将数据和索引分隔开,索引的叶子节点关联的是对应的主键。

我们结合图看一下聚集索引和非聚聚索引(二级索引),可以发现主键索引是聚集索引,数据的存储和索引放到一起,叶子节点存储的是对应的行数据,其余索引是非聚集索引,可以看到索引的数据的存储是分隔开的,叶子节点关联的是对应的主键id。

 

索引检索:回表查询,先走非聚类索引找到对应的主键值,根据主键值到聚集索引上拿到主键值对应的行数据。 

我们看几个思考题,可以看出根据id查询效率更高,直接走聚集索引对比id即可,根据name查询要先走非聚集索引找到id,再回表查询行数据。

4、索引语法

我们看一下索引的基本语法,创建索引用create index, 删除索引用 drop index,查看索引用show index,如下:

5、SQL性能分析

1)SQL执行频率,我们可以通过执行如下指令查询当前数据库的crud的访问频次,进而选取合适的SQL优化策略。

2)也可以通过开启慢查询日志定位执行效率比较低的SQL,只需要再配置文件启动开启慢查询,设置慢日志时间即可。如下: 

 3)也可以通过执行profile查看每一条SQL的耗时情况,也可以查看指定查询语句的各个阶段的查询情况,如下:

 4)使用explain可以查看各条语句的执行情况,主要关注type,优化的时候尽量使得连接类型性能好的方向优化,而避免all的情况。主键或者唯一性索引访问是const,非唯一性索引会出现ref。

6、索引使用

在使用索引之前,可以通过先验证加索引后性能是否提升,使用explain关键可以查看具体SQL居于的执行情况相关参数。

 对于复合索引的使用要满足最左前缀法则,不能缺少最左侧的列,否则索引全部失效,如果跳过索引的列,该列后的索引后面的字段索引全部失效。

 对于复合索引如果出现范围查询>或者<这种,会导致范围查询右侧索引失效。

 尽量不要在索引列上进行运算操作,会导致索引失效。

 字符串不加单引号,会导致索引失效。

使用like进行模糊查询的情况下,以%开头的模糊匹配会导致索引失效。

 使用or条件连接的情况下,只要有列没有索引,就会导致索引失效。

 如果MySQL觉得走全部扫描更快,则不走索引。

我们看一下SQL提示,是优化数据库的一个重要手段,可以指定建议使用的索引,忽略索引以及强制使用索引,如下:

我们看一下思考题,需要对select  id, username, password from 表名 where username = "张三"语句进行优化,该怎么样进行优化呢,最优的方案是根据(username,password)建立一个复合索引,因为复合索引下面的数据就是id,这样就可以避免回表查询。

使用前缀索引节约索引空间,提升索引效率,根据索引选择性 来确定索引的长度,选择性=不重复的索引值/数据表中的记录总数,索引选择性越高,则索引查询效率越高。

如果存在多个查询条件, 建议针对查询字段时建立联合索引,而非单列索引。如果是多条件的单列索引,MySQL会评估走哪个索引的查询效率高,便会选择哪一个。

 

7、索引设计原则

索引设计的七大原则:1.数据量大查询频繁建索引;2.常作为查询、分组、排序条件的建索引;3.对于区分度高的列建索引;4.字符串很长的可以使用前缀索引;5.尽量使用复合索引;6.控制索引数量;索引列不能存储控制,在建表时用非空约束。

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

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

相关文章

《爆肝整理》保姆级系列教程python接口自动化(二十一)--unittest简介(详解)

简介 前边的随笔主要介绍的requests模块的有关知识个内容&#xff0c;接下来看一下python的单元测试框架unittest。熟悉 或者了解java 的小伙伴应该都清楚常见的单元测试框架 Junit 和 TestNG&#xff0c;这个招聘的需求上也是经常见到的。python 里面也有单元 测试框架-unitt…

数据结构_ 堆结构与堆排序(c++ 实现 + 完整代码 )

堆结构与堆排序 文章目录堆结构与堆排序引入堆堆结构所满足的数学特性准备代码----------- 往堆中插入元素----------- 删除堆顶堆排序构建完整代码及测试动态分配版本非动态版本引入堆 二叉树 具有左孩子与右孩子的最普通的二叉树。 满二叉树 特殊的二叉树&#xff1a;每个节…

HTML课堂笔记

HTML 课堂笔记 文章目录相关概念code我的第一个html页面基本标签相关概念 1、什么是HTML&#xff1f; Hyper Text Markup Language 超文本标记语言 超文本&#xff1f;超级文本&#xff0c;例如流媒体&#xff0c;声音、视频、图片等。 标记语言&#xff1f;这种语言是由大量…

【Git】使用Git上传项目到远程仓库Gitee码云步骤详解

电脑里存放了很多项目&#xff0c;有的备份&#xff0c;有的没备份&#xff0c;如果不仔细分类管理的话&#xff0c;时间一长&#xff0c;到时看到那就会觉得非常杂乱&#xff0c;很难整理&#xff0c;这里有一个叫源代码托管&#xff0c;用过它的都知道&#xff0c;方便管理和…

【7/101】101次面试之测试技术面试题

01、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f;答&#xff1a;兼容性测试是一种软件测试类型&#xff0c;它的主要目的是确保一个应用程序在不同的操作系统、不同的浏览器、不同的设备、不同的网络环境等各种环境下能够正常运行&#xff0c;并且不会产生…

【并发编程十八】线程局部存储(TLS)

【并发编程十八】线程局部存储(TLS&#xff09;一、定义二、线程局部存储的实现1、windows系统2、linux系统3、c11三、windows系统1、线程局部存储是分块的&#xff08;TLS_MINIMUM_AVAILABLE&#xff09;2、获得索引3、通过索引&#xff1a;存储数据、取出数据4、释放索引和内…

UI自动化测试、接口测试等自动化测试策略

今天跟大家介绍UI测试、接口测试、单元测试主要内容&#xff0c;以及每种测试花费时间讨论。 UI测试【Selenium】 UI测试是最接近软件真实用户使用行为的测试类型。通常是模拟真实用户使用软件的行为&#xff0c;即模拟用户在软件界面上的各种操作&#xff0c;并验证这些操作对…

从0探索NLP——神经网络

从0探索NLP——神经网络 1.前言 一提人工智能&#xff0c;最能想到的就是神经网络&#xff0c;但其实神经网络只是深度学习的主要实现方式。 现在主流的NLP相关任务、模型大都是基于深度学习也就是构建神经网络实现的&#xff0c;所以这里讲解一下神经网络以及简单的神经网络…

Anaconda和PyCharm的一些安装问题和命令

今天更新了Windows上的Anaconda到2.3.2&#xff0c;PyCharm到2022.3。 ——发现是纯纯的犯贱orz。出了一堆问题。在这里记录一下供后来者参考。 Anaconda安装 将.\anaconda3\Scripts 和.\anaconda3\Library\bin添加到系统环境变量中。 新建环境的目录在.\anaconda3\envs下 N…

【黑盒模糊测试】路由器固件漏洞挖掘实战--AFL++ qemu_mode

前言 很久之前就想写AFL++的qemu_mode了,只是模糊测试专题的文章有些过于耗费时间,加上工作原因导致一直搁置。最近需要出差会用到黑盒模糊测试,所以就当做复习一遍,我记得Fuzzing 101也有一个qemu_mode的练习,有空的话下一篇文章更新吧~ 编写不易,如果能够帮助到你,希望…

linux的文件权限介绍

文件权限 在linux终端输入 ls -lh 出现下面界面 介绍 基本信息 其中的开头代表着文件类型和权限 而 root 和kali 则分别代表用户名和用户组名用户名顾名思义就是这个文件属于哪一个用户用户组是说自己在写好一个文件后&#xff0c;这个文件是属于该用户所有&#xff0c;…

Java中的Stack与Queue

文章目录一、栈的概念及使用1.1 概念1.2 栈的使用1.3 栈的模拟实现二、队列的概念及使用2.1 概念2.2 队列的使用2.3 双端队列(Deque)三、相关OJ题3.1 用队列实现栈。3.2 用栈实现队列。总结一、栈的概念及使用 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在…

Linux系统安装MySQL8.0版本详细教程【亲测有效】

首先官网下载安装包&#xff1a;https://downloads.mysql.com/archives/community/ 一、上传到安装服务器 二、解压 tar -xvf mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz三、移动位置并重新命名 mv mysql-8.0.31-linux-glibc2.12-x86_64 /usr/local/mysql四、创建mysql用户…

Docker 如何配置镜像加速

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难&#xff0c;此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务&#xff0c;例如&#xff1a; 科大镜像&#xff1a;https://docker.mirrors.ustc.edu.cn/网易&#xff1a;https://hub-…

代码随想录【Day21】| 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先

530. 二叉搜索树的最小绝对差 题目链接 题目描述&#xff1a; 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 示例&#xff1a; 提示&#xff1a;树中至少有 2 个节点。 难点&#xff1a; 解答错误&#xff01;仅考虑了…

【Npde.js】express以及nodemon

express初始Express什么是Express不使用Express可以创建web服务器吗&#xff1f;Express能做什么安装Express监听GET请求和post请求获取URL中携带的查询参数获取URL中携带的动态参数托管静态资源nodemon为什么使用nodemon初始Express 什么是Express 官方给出的概念&#xff0…

Vue3 基础

Vue3 基础 概述 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&…

Java:Java与Python — 编码大战

Java和Python是目前市场上最热门的两种编程语言&#xff0c;因为它们具有通用性、高效性和自动化能力。两种语言都有各自的优点和缺点&#xff0c;但主要区别在于Java 是静态类型的&#xff0c;Python是动态类型的。它们有相似之处&#xff0c;因为它们都采用了“一切都是对象”…

单片机输入输出模式

单片机输入输出模式输入模式模拟输入、浮空输入、上拉输入、下拉输入GPIO输出模式推挽输出、开漏输出、复用推挽输出、复用开漏输出。上下拉电阻上拉电阻下拉电阻输入模式 模拟输入、浮空输入、上拉输入、下拉输入 模拟输入&#xff1a;I/O端口的模拟信号&#xff08;电压信号…

日志收集笔记(架构设计、Log4j2项目初始化、Lombok)

1 架构设计 ELK 技术栈架构设计图&#xff1a; 从左往右看&#xff0c; Beats&#xff1a;主要是使用 Filebeat&#xff0c;用于收集日志&#xff0c;将收集后的日志数据发送给 Kafka&#xff0c;充当 Kafka 的生产者Kafka&#xff1a;高性能消息队列&#xff0c;主要起缓冲…