MySQL进阶 - 索引

01 索引概述

【1】概念:索引就是一种有序的数据结构,可用于高效查询数据。在数据库表中除了要保存原始数据外,数据库还需要去维护索引这种数据结构,通过这种数据结构来指向原始数据,这样就可以根据这些数据结构实现高级查找算法。(总之就是把表中的数据存储在数据结构中了)

【2】无索引和有索引的区别:(下图中二叉树索引结构并不是真实的索引结构,只是打个比方)

         ① 无索引:一个一个数据进行遍历,即使找到了,也会把整张表遍历完。

         ② 有索引:会在利用数据结构存储表中相关数据,以及数据所指向的地址。

【3】索引的优点:① 提高查询效率 ② 提高排序效率

【4】索引的缺点(可以忽略):① 索引要占用磁盘空间(磁盘现在很便宜) ② 增删改的效率低(业务操作中其实增删改的操作比例很小)

02 索引结构

02_01 介绍与支持

【1】索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构。

【2】索引结构:

         B+tree类型的索引结构常用的存储引擎都支持,且是InnoDB存储引擎默认的索引结构。

         Hash索引性能高但不支持范围查询,只支持精确匹配。

【3】不同的存储引擎对索引结构的支持情况:

【4】如果没有指定是哪种存储引擎的哪种索引结构,则默认说的是B+tree索引。工作、面试问的索引问的是B+tree索引。

02_02 B树的演变过程

11. 进阶-索引-结构-Btree_哔哩哔哩_bilibili

02_03 B+树的演变过程

12. 进阶-索引-结构-B+tree_哔哩哔哩_bilibili

【1】所有的元素都会出现在叶子节点。

【2】非叶子节点只是起索引的作用。

【3】所有的叶子节点构成了一个单项链表。

02_04 MySQL中B+tree索引结构

【1】在B+tree基础上将所有的叶子节点构成了一个双向链表。

【2】每一个节点都存储在一个页中(表空间段区页行),且一个页的大小在InnoDB中是16K。

02_05 Hsh索引结构

02_06 InnoDB为啥使用B+tree索引

① 二叉树,顺序插入时,会形成一个链表,查询性能低。

② 红黑树,大数据量的情况下,层级较深,检索速度慢。

③ B树,叶子节点和非叶子节点都会存放数据,而每一个节点存储在的页空间是有限的,如果非叶子节点不存放数据,则存储每个非叶子节点的页空间变增多,此时就可以存放更多的key和指针,key和指针增多了,最终相同数据量的情况下,使用B+tree的深度会浅一些。

④ hash索引结构,hash索引只支持等值匹配,并不支持范围匹配和排序操作的。

03 索引分类

【思考问题】:

  解答:假设每一行数据大小为1k,而每个页的大小为16k,所以一个页能存16行数据。

             如果B+tree高度为2,设一个页中可以存放n个key,n*8+(n+1)*6=16*1025,n = 1170

             此时叶子节点的个数为1171,可存放行数为1171*16 = 18736

04 索引语法

【1】在创建索引时,一个索引可以关联多个字段。如果一个索引只关联一个字段,这种索引称为单列索引;如果一个索引只关联了多个字段,这种索引称为联合索引/组合索引,注意:联合索引的顺序是有要求的

05 SQL性能分析工具

【为什么要学,SQL性能分析的工具】:因为我们要做SQL优化,要做SQL优化首先得定位到要对那个类型的SQL进行优化,这时候我们就得知道每个SQL的执行性能是怎样的。在做SQL优化的时候,我们优化的主要是与查询有关的SQL,而在优化查询语句时对索引的优化其实占主导地位。

05_01 SQL执行频率

【为什么要知道SQL的执行频率】:假如有一个业务系统,这个业务系统有一个数据库,数据库里面表中的数据量特别大,但这张表只做插入,不做查询,那我们对索引进行优化是没必要的。

【查询全局/当前回话的状态信息】:

05_02 慢查询日志

 【1】我们知道了SQL执行频率,就知道了哪一类语句执行频率高,如果想进一步知道执行频率高的语句里是哪些具体的语句执行效率低,就需要用到慢查询日志。

【2】概念:可以用来记录语句执行时间超过指定参数long_query_time,单位秒,默认10s,的所有SQL语句。

【3】MySQL的慢查询日志默认是关闭的,查看开关情况:show variables like 'slow_query_log'

        打开慢查询日志需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

        slow_query_log=1

        long_query_time=2

【具体步骤】:

        以root用户登录linux命令行,输入vi /etc/my.cnf  ---》按G  ---》然后按一下s  ---》然后写配置信息 --》然后按ins、esc --》在命令行中写:x,保存并关闭

        重启mysql服务器:systmctl restart mysql

        查看慢查询日志中记录的信息:以root用户登录linux命令行 ---》cd /va/lib/mysql ---》ll ---》cat localhost-slow.log

05_03 profile详情

【1】加入有些语句业务很简单,但是执行的时间为1.8s,这类的SQL性能也会认为是很低的,我们也需要对这一类的SQLj进行优化

【2】select @@have_profiling; 查看当前数据库是否支持profile

          数据库的profile开关默认是关着的,查看profile开关情况:select @@profiling;

                                                                   开启开关:set session/global profiling = 1;

【3】查看当前回话中,所有SQL的耗时情况:show profiles;

【4】查询指定query_id的SQL语句各阶段的耗时情况:show profile for query query_id;

【5】查询指定query_id的SQL语句CPU的使用情况:show profile cpu for query query_id;

05_04 explain执行计划

【1】概念:通过explain 或者 desc 命令可以获取某条 select 语句的执行计划,从而评定某条select语句的执行性能。

【2】语法:在任意的select语句之前加上explain / desc 

06 索引使用

06_01 最左前缀法则(索引失效)

【说明】:

   ① 针对于联合索引(一个索引关联了多个字段)

   ② 我们在查询数据时,如果可以根据索引来查,就根据索引来查,如果无法根据索引就进行全表扫描

   ③ 最左前缀法则:使用的联合索引最左列必须存在(注意:这里说的索引最左列不是说你写的where语句中的顺序,而是索引名中字段的顺序),否则进行全表扫描;如果跳过了索引中的列,则该索引后面的字段会失效。

06_02 范围查询右侧的列索引失效(索引失效)

【说明】:

   ① 和最左前缀法则一样,针对的是联合索引

   ② 范围查询右侧的列索引失效:在联合索引中,出现了某字段使用了>,<的比较,则该字段后面的索引将失效

   ③ 如何规避:在业务允许的条件下,尽量使用>=,<=

06_03 不要在索引列上进行运算操作否则索引失效(索引失效)

06_04 字符串类型不加引号查询索引将会失效(索引失效)

06_05 模糊查询(索引失效)

【说明】:如果仅仅是尾部模糊匹配,索引不会失效,如果是头部模糊匹配,索引会失效。

06_06 or连接的条件(索引失效)

只有or的两侧都有索引的时候,索引才会失效。

06_07 数据分布的影响(索引失效)

06_08 SQL提示

【说明】:在可以使用多个索引的情况下,指定使用哪个索引,指定不使用哪个索引,指定必须使用哪个索引。(如果只是指定,并不强制,则MySQL也会去自己权衡到底使用哪一个)

06_09 覆盖索引

【说明】:尽量避免使用select * 

06_09 前缀索引

06_10 单列索引和联合索引的选择

07 索引设计原则

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

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

相关文章

一个月学会Java 第8天 方法与递归

Day8 方法与递归 方法这个东西我们之前讲过&#xff0c;但是只是讲了原理并没有详细的讲解东西&#xff0c;还有构造器这个东西&#xff0c;也只是介绍过全貌&#xff0c;构造器其实就是一个特殊的方法&#xff0c;但是由于特殊&#xff0c;所以我们之后再讲&#xff0c;还有一…

yolov8/9/10/11模型在中医舌苔分类识别中的应用【代码+数据集+python环境+GUI系统】

yolov8、9、10、11模型在中医舌苔分类识别中的应用【代码数据集python环境GUI系统】 背景意义 目前随着人们生活水平的不断提高&#xff0c;对于中医主张的理念越来越认可&#xff0c;对中医的需求也越来越多。 传统中医的舌诊主要依赖于医生的肉眼观察&#xff0c;仅仅通过这…

69.【C语言】动态内存管理(重点)(2)

本文为数据结构打下基础 备注:数据结构需要掌握指针,结构体和动态内存管理 承接68.【C语言】动态内存管理(重点)(1)文章 目录 3.free函数 cplusplus网的翻译 提炼要点 使用 x86debug环境下, 打开内存窗口 建议 3.free函数 cplusplus的介绍 点我跳转 cplusplus网的翻译…

计算机网络:计算机网络概述:网络、互联网与因特网的区别

文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络&#xff0c;若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…

信息安全工程师(40)防火墙技术应用

一、防火墙的基本概念 防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量&#xff0c;以保护网络免受未经授权的访问和攻击。它可以是装配多张网卡的通用计算机&#xff0c;也可能是通用的物理设备。防火墙通过在网络之间设置访问控制策略&#xff0c;对进出的通信流…

JAVA开源项目 加油站管理系统 计算机毕业设计

本文项目编号 T 003 &#xff0c;文末自助获取源码 \color{red}{T003&#xff0c;文末自助获取源码} T003&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

vue3中el-input在form表单按下回车刷新页面

摘要&#xff1a; 在input框中点击回车之后不是调用我写的回车事件&#xff0c;而是刷新页面&#xff01; 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 再写一个input 表单 &#xff0c;并设置style“display:none” <ElInput style"display…

[Python] 使用Python自定义生成二维码

文章目录 目录 安装 qrcode 库生成简单的二维码代码讲解 生成自定义样式的二维码代码讲解 生成带有链接的二维码代码讲解 Demo代码实现代码讲解 总结 收录专栏: [Python] 二维码是现在非常常用的一种信息存储和传递方式&#xff0c;我们可以通过扫描二维码来快速获取文本、链接…

论文精读之Label-Augmented Dataset Distillation (LADD)标签增强数据集蒸馏

[TOC](论文精度之Label-Augmented Dataset Distillation (LADD)标签增强数据集蒸馏) 0.前言 现在开始要不断培养我自身的阅读论文的能力,我的方法不一定是对的,但是不犯错的前提就在于要先犯错,提早去培养自己该方面的能力,其实很早之前就了解到了一些论文学习的方法,但自己总…

Redis 5 种基本数据类型的前两个详解

Redis 共有 5 种基本数据类型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散列&#xff09;、Zset&#xff08;有序集合&#xff09;。 这 5 种数据类型是直接提供给用户使用的&…

SAP ABAP 代码搜索工具 CODE_SCANNER

SAP ABAP 代码搜索工具 CODE_SCANNER 作为一个熟练的 ABAP 经常要查一下某个function有没有被别的程序调用&#xff0c;或者查看某个function在参考别的程序的调用方法。这就会经常用到 CODE_SCANNER 这个TCODE。 例子一&#xff1a;例如查询 某个smartform 被哪个程序调用了&…

网页打不开、找不到服务器IP地址

现象&#xff1a;网络连接ok&#xff0c;软件能正常使用&#xff0c;当网页打不开。 原因&#xff1a;DNS 配置错误导致网站域名无法正确解析造成。 影响DNS设置的&#xff1a;VPN软件、浏览器DNS服务选择、IPv4属性被修改。 1、VPN代理未关闭 2、浏览器DNS解析选择 3、以太…

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【285-296】

文章目录 285. 为什么需要继承286. 继承原理图287. 继承快速入门288. 289. 290. 291. 292. 继承使用细节1,2,3,4,5288.1 继承给编程带来的便利288.2 继承的深入讨论/细节问题 293. 继承本质详解294. 继承课堂练习1295. 继承课堂练习2296. 继承课堂练习3 285. 为什么需要继承 28…

同城O2O系统源码与跑腿配送平台的架构设计与开发方案详解

今天&#xff0c;笔者将与您一同深入探讨同城O2O系统的源码及跑腿配送平台的架构设计与开发方案&#xff0c;助力开发者和企业在这一领域的实践与探索。 一、O2O系统概述 在同城O2O模式中&#xff0c;用户可以通过手机应用或网页平台下单&#xff0c;而配送员则根据订单信息迅…

[图形学]smallpt代码详解(1)

一、简介 本文介绍了著名的99行代码实现全局光照的光线跟踪代码smallpt。 包括对smallpt的功能介绍、编译运行介绍&#xff0c;和对代码的详细解释。希望能够帮助读者更进一步的理解光线跟踪。 二、smallpt介绍 1.smallpt是什么 smallpt(small Path Tracing) 是一个全局光照…

鸿蒙NEXT开始公测,哪些机型可以升级?鸿蒙版微信界面简洁

华为 Harmony OS NEXT 于10月8日正式开启公测&#xff0c;对鸿蒙 NEXT 系统感兴趣&#xff0c;想要第一时间尝鲜鸿蒙系统的话&#xff0c;千万不要错过本篇文章&#xff01; 哪些手机可以参与鸿蒙 NEXT 公测&#xff1f; 首批参与鸿蒙 NEXT 公测的机型有华为 Mate 60 系列、华…

Electron构建桌面应用程序,服务于项目的自主学习记录(持续更新...

无所畏惧地面对未知&#xff0c;并将其视为成长的机会 大纲官网快速入门1.安装node.js -- 这里推荐用nvm管理2.脚手架创建3.electron 包安装到应用的开发依赖4.创建主进程(main.js)并启动项目1.创建页面2.配置main.js3.启动项目 -- 效果 进阶 -- 基于项目场景功能使用场景一&am…

Java8新特性, 函数式编程及Stream流用法大全

用了多少年的java8了&#xff0c;Lambda表达式和stream流也经常用&#xff0c;但是也仅限于某些用法比较熟练&#xff0c;看见了 Function、Consumer 等函数式接口还是一脸懵逼&#xff0c;现在来全面总结一下java8这些新特性&#xff0c;也为自己后续查找做个备忘。如果你只是…

【C++】模板(初识):函数模板、类模板

本篇主要介绍C中的模板初阶的一些知识。模板分为函数模板和类模板&#xff0c;我们一个一个来看。 1.函数模板 1.1函数模板概念 函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实际的参数类型产生函数特定版本。…

人工智能平台 PAI-DSW内置通义灵码实操

人工智能平台 PAI&#xff08;Platform for AI&#xff0c;原机器学习平台PAI&#xff09;是 AI Native 的大模型与 AIGC 工程平台&#xff0c;提供包含数据集管理、算力管理、模型工具链、模型开发、模型训练、模型部署、AI资产管理在内的功能模块&#xff0c;内置100种大模型…