Mysql索引规范及原理分析

1 Mysql存储引擎

MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。

存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式。

MylSAM存储引擎,5.5版本之前的默认存储引擎

MylSAM拥有较高的插入、查询速度,但不支持事物,也不支持外键,但是访问速度快。可以用来存储日志记录等功能。由于目前不再使用,大家大概了解下即可。

lnnoDB存储引擎,5.5版本之后的默认存储引擎

InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。是大家必须知晓的内容。后续的内容均默认使用InnoDB存储引擎。

2 什么是索引

在mysql中,索引是存储引擎用于快速找到记录的一种数据结构。

索引的本质就是通过不断的缩小想要获取数据的范围来筛选出最终想要的结果。类似我们查字典,每一个字相当于一条数据,索引相当于目录,可以根据拼音或者偏旁部首快速查询出页码,进而查询到对应的信息。

总结来说,索引对于提升系统性能有较大的帮助,需要进一步的了解它。

问题1:为什么SQL查询很慢?

解答:未创建索引。

问题2:已经添加了索引,为什么SQL仍然很慢?

解答:未创建正确索引。索引无效。mysql优化器选择其他索引。mysql优化器不走索引,选择全表扫描。

问题3:已经添加了索引,也明确了SQL使用该索引,为什么SQL依旧很慢?

解答:1.单表数据量过多。即使添加了索引,仍然性能不高。2.Mysql分页机制,比如大数据分页场景下,即使使用了索引,仍然慢响应。3.使用性别等区分度小的字段作为索引,无法提高性能。

使用索引的注意事项:

1.表必须设置主键,建议使用系统自增的id主键。

2.索引名全部使用小写英文字母,采用下划线进行分割。

3.普通索引按照"idx_字段名”的格式进行命名。比如idx_driver_id。

4.唯一索引按照"unique字段名"的格式进行命名。比如unique_driver_id。

5.一张表中的索引数量建议不超过7个。(索引过多,影响写入性能,可能存在优化器选择错误索引的情况,具体数量视场景而定)

6.根据具体业务场景合理创建联合索引,可以有效减少索引数量。比如联合索引(a,b,c),相当于索引(a),(a,b),(a,b,c),因为其满足索引的最左匹配原则。

7.使用联表查询时,join列的数据类型必须相同,并且均需要创建索引。10.不在区分度低的字段上建立索引。

8.合理使用覆盖索引,可以有效减少回表lO。

MySQL为什么最终要去选择B+Tree?

  1. B+Tree是B TREE的变种,BTREE能解决的问题,B+TREE也能够解决(降低树的高度,增大节点存储数据量)

  1. B+Tree扫库和扫表能力更强。如果我们要根据索引去进行数据表的扫描,对B TREE进行扫描,需要把整棵树遍历一遍,而B+TREE只需要遍历他的所有叶子节点即可(叶子节点之间有引用)。

  2. B+TREE磁盘读写能力更强。他的根节点和支节点不保存数据区,所以根节点和支节点同样大小的情况下,保存的关键字要比B TREE要多。而叶子节点不保存子节点引用,能用于保存更多的关键字和数据。所以,B+TREE读写一次磁盘加载的关键字比B TREE更多。

  3. B+Tree排序能力更强。上面的图中可以看出,B+Tree天然具有排序功能

  4. B+Tree查询性能稳定。B+Tree数据只保存在叶子节点,每次查询数据,查询lo次数一定是稳定的。当然这个每个人的理解都不同,因为在BTREE如果根节点命中直接返回,确实效率更高。

B+树的数据结构是按照关键字进行比较的。

数值型:直接按照数值进行排序

字符型:按照每个字母的acsii值进行比较

(字符串也可以比较“大小”,有大小那就可以排序。 两个字符串自左向右逐个字符相比(按ASCIl值大小相比较),直到出现不同的字符或遇'\o'为止。)

3 索引最左匹配原则

当进行匹配的时候,会把字符串转换成ascll码,如abc变成97 、98、 99,然后从左往右一个字符一个字符进行对比。所以在sql查询中使用like %a时候索引会失效,因为%表示全匹配,如果已经全匹配就不需要索引,还不如直接全表扫描。

当关键字占用的空间越小,则每个节点保存的关键字个数就越多,每次加载进内存的关键字个数就越多,检索效率就越高。创建索引的关键字要尽可能占用空间小。

4 最少空间原则

主键是bigint,8bit;页号是4bit,一共12bit。一页总数:15K%12bit=1280条。

再假如每行数据大小为1Kb,每个叶子节点能存放数据就是15K%1K=15条。

一层的B+树存放数据是15

二层的B+树存放数据是1280*15

三层的B+树存放数据是1280乘以1280乘以15=2400万

因为考虑到磁盘IO性能问题,当超过3次时性能会急剧下降。如果每行数据只有250bit,单页数据可存放60条,三层B+树可存放接近1亿了,访问速度一样不会慢。

如果当前插入的数据是自增序列的话,只有右边的树形结构进行旋转变化,左侧并没有,因此Mysql主键建议用自增序列,不建议UUID自增主键的插入数据模式,正符合了我们前面提到的递增插入的场景。每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。而有业务逻辑的字段做主键,则往往不容易保证有序插入,这样写数据成本相对较高。

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

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

相关文章

【打工日常】云原生之部署个人使用的高速下载器Gopeed

​一、Gopeed介绍1.Gopeed简介 Gopeed(全称 Go Speed),直译过来中文名叫做够快下载器(不是狗屁下载器!),是一款由 Golang + Flutter 开发的高速下载器,支持(HTTP、BitTorrent、Magnet)协议下载,并且支持所有平台使用。支持的平台:Windows,Macos,Linux,Android,…

Pytorch 的神经网络 学习笔记

参照官方网址 Module — PyTorch 2.2 documentation 一. 介绍 1. torch.nn模块: torch.nn是PyTorch中专门用于构建神经网络的模块。它提供了构建深度学习模型所需的所有构建块,包括各种层类型(如全连接层、卷积层、循环层等)、…

SkyWalking 自定义Span并接入告警

图容易被CSDN吞掉,我在掘金也发了:https://juejin.cn/post/7361821913398837248 我就是这么膨胀 最近在做 OpenAI API 套壳,当我使用 okhttp-sse 这个库进行流式内容转发的时候,我发现有些回调方法 SkyWalking 不能抓取到。这就…

在no branch上commmit后,再切换到其他分支,找不到no branch分支的修改怎么办?

解决办法 通过git reflog我们可以查看历史提交记录,这里的第二条提交(fbd3ea8)就是我在no branch上的提交。 再通过git checkout -b backup fbd3ea8,恢复到上次提交的状态,并且为其创建个分支backup,此时…

跳出框架:Facebook的创新策略与社交影响

1. 引言 在数字化时代,社交媒体如同一面镜子,反映出我们社会的多元性和变革。Facebook,作为这面镜子中最明亮的一个,不仅改变了人们的日常生活,更深刻地塑造了社交、文化和经济的面貌。本文将深入探讨Facebook的创新策…

使用Python的subprocess标准模块Popen()函数打开文件

使用Python的subprocess标准模块Popen()函数打开文件 subprocess模块是Python标准库中用于创建和管理子进程的标准模块。其中Popen()这个函数Python标准模块subprocess中的Popen()函数用处非常广泛,它用于创建新的进程,执行外部命令,并与它们…

java中的泛型(二)——泛型接口以及泛型方法

在上一篇文章中&#xff0c;简要地对泛型的概念以及泛型类的使用进行了说明。除了在泛型类之外&#xff0c;泛型还可以在接口和方法中使用。 泛型接口 对于泛型接口&#xff0c;它的声明方式为: public interface 接口名 <泛型>{泛型定义的抽象方法}。这个声明方式和泛型…

网络安全实训Day15

写在前面 电子垃圾&#xff0c;堂堂恢复连载。本来不想分天数梳理了&#xff0c;但是最后要写实训报告&#xff0c;报告里还要有实训日记记录每日学的东西&#xff0c;干脆发这里留个档&#xff0c;到时候写报告提供一个思路。 网络空间安全实训-渗透测试 渗透测试概述 定义 一…

[Android14] SystemUI的启动

1. 什么是System UI SystemUI是Android系统级应用&#xff0c;负责反馈系统及应用状态并与用户保持大量的交互。业务主要涉及的组成部分包括状态栏(Status Bar)&#xff0c;通知栏(Notification Panel)&#xff0c;锁屏(Keyguard)&#xff0c;控制中心(Quick Setting)&#xff…

北京车展创新纷呈,移远通信网联赋能

时隔四年&#xff0c;备受瞩目的2024&#xff08;第十八届&#xff09;北京国际汽车展览会于4月25日盛大开幕。在这场汽车行业盛会上&#xff0c;各大主流车企竞相炫技&#xff0c;众多全球首发车、概念车、新能源车在这里汇聚&#xff0c;深刻揭示了汽车产业的最新成果和发展潮…

Rust中的函数指针

什么是函数指针 通过函数指针允许我们使用函数作为另一个函数的参数。函数的类型是 fn &#xff08;使用小写的 ”f” &#xff09;以免与 Fn 闭包 trait 相混淆。fn 被称为 函数指针&#xff08;function pointer&#xff09;。指定参数为函数指针的语法类似于闭包。 函数指…

前端到全栈进阶之“前端框架”

从前端入门到全栈-系列介绍 你会学到什么&#xff1f; 可能学不到什么东西&#xff0c;该系列是作者本人工作和学习积累&#xff0c;用于复习 系列介绍 现在的 Web 前端已经离不开 Node.js&#xff0c;我们广泛使用的 Babel、Webpack、工程化都是基于 Node 的&#xff0c;各…

react useEffect中window.removeEventListener没生效问题解决

在useEffect中写入window.removeEventListener没有生效&#xff0c;代码如下 useEffect(() > {const handleResize () > {console.log(window.innerWidth, window.innerHeight);};window.addEventListener(resize, handleResize);return () > {window.removeEventLi…

TiDB-PCTP考试复习

前言&#xff1a;本文仅作学习交流使用&#xff0c;对应《TiDB 数据库管理&#xff08;303&#xff09;》 补充&#xff1a;本文章仅用于个人学习&#xff0c;未经PingCAP书面许可&#xff0c;任何单位或个人不得将文档内容用于商业目的&#xff0c;或对本文章进行转载、编辑、…

商城数据库88章表36~39

schooldb库——utf8字符集——utf8_general_ci排序规则 先创建库&#xff0c;再去使用下列的DDL语句。 &#xff08;36&#xff09;DDL——操作记录表 CREATE TABLE huang_log_operates (operateid int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,staffid int(11) NOT NUL…

使用Keil移植工程时修改单片机型号参数

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 当使用Keil对STM32系列单片机开发时&#xff0c;如果使用的是库函数&#xff0c;那么不同型号单片机的工程项目文件是可以直接移植的。只需要按照下面的步骤修改对应的芯片&#xff0c;就可以直接将工程移植过去&a…

RabbitMQ(高级)笔记

一、生产者可靠性 &#xff08;1&#xff09;生产者重连&#xff08;不建议使用&#xff09; logging:pattern:dateformat: MM-dd HH:mm:ss:SSSspring:rabbitmq:virtual-host: /hamllport: 5672host: 192.168.92.136username: hmallpassword: 123listener:simple:prefetch: 1c…

hive启动beeline报错

问题一在zpark启动集群报错 出现上面的问题执行以下代码 chmod 777 /opt/apps/hadoop-3.2.1/logs 问题二启动beeline报错 执行 cd /opt/apps/hadoop-3.2.1 bin/hadoop dfsadmin -safemode leave 问题三执行查询语句报错 执行 set hive.exec.mode.local.autotrue;

flutter 解决ExpandableText组件三个点调整颜色问题

文章目录 前言一、相关代码总结 前言 最近写flutter项目&#xff0c;在使用ExpandableText时解决了一些问题&#xff0c;下面是解决方案&#xff0c;希望帮助到大家。 一、相关代码 1、代码如下&#xff1a; 2、我们设置linkColor就能设置ExpandableText三个点的颜色 Expand…

Spring Boot Admin

概述 Spirng Boot Admin 登录页面 Spring Boot Admin是一个用于管理Spring Boot应用的监控工具,它允许你查看和管理多个Spring Boot应用实例。用于应用信息进行界面化的展示&#xff0c;常常辅助我们开发人员快速查看服务运行状态在微服务架构中&#xff0c;Spring Boot Admin通…