Mysql索引规范及原理分析

news2025/1/18 17:06:36

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.coloradmin.cn/o/1628010.html

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

相关文章

Linux多进程(五) 进程池 C++实现

一、进程池的概念 1.1、什么是进程池 进程池是一种并发编程模式,用于管理和重用多个处理任务的进程。它通常用于需要频繁创建和销毁进程的情况,以避免因此产生的开销。 进程池的优点包括: 减少进程创建销毁的开销:避免频繁创建和…

​可视化大屏C位图:城市地图,一览城市全貌信息。

城市地图是一种常见的可视化大屏C位图,用于展示城市的地理分布和相关数据。以下是对城市地图的解读: 地理分布 城市地图可以展示不同地理区域的城市分布情况。通过地图上的点、标记或区域着色等方式,可以清晰地看到城市的位置和分布范围。这…

后端工程师——C++工程师如何准备面试?

相比 Java 语言方向,C++ 入门简单,精通难,找工作竞争压力更小,但 C++ 依然是近年来招聘的热门岗位之一。本文将从以下三个方面进行详细讲解,帮助你对 C++ 相关岗位的就业前景、岗位要求、学习路线等有更充分的了解。 C++工程师面试准备 上两篇文章对 C++ 工程师的招聘需求…

虚拟机VMware下ROS Neotic(Ubuntu 20.04)下安装OpenCV

一、ROS安装 ROS的官方安装步骤: 1、noetic / Ubuntu 20.04 : http://wiki.ros.org/noetic/Installation/Ubuntu 2、melodic / Ubuntu 18.04: http://wiki.ros.org/melodic/Installation/Ubuntu 3、kinetic / Ubuntu 16.04: http:…

如何使用IDEA直接连接MySQL数据库

如何使用IDEA直接连接MySQL数据库 新建一个空项目打开DataBase窗口连接数据库第一次连接 需要先下载驱动上一步驱动下载太慢怎么办?下载好驱动后 测试连接 新建一个空项目 打开DataBase窗口 连接数据库 第一次连接 需要先下载驱动 如果这里下载的很慢 看下一步解决…

算法 || 二分查找

目录 二分查找 在排序数组中查找元素的第一个和最后一个位置 搜索插入位置 一个数组经过划分后具有二段性的都可以用二分查找 二分查找 704. 二分查找 - 力扣(LeetCode) ​ 暴力解法:直接遍历数组,找到 target 便返回下标&am…

星尘智能 AI 机器人 S1——国产机器人的巅峰之作

AI智能机器人真的太炸裂了 国产科技威武-CSDN直播AI智能机器人真的太炸裂了 国产科技威武https://live.csdn.net/v/382519 最近发现了一个国产的机器人,真的让人惊叹不已!它就是星尘智能 AI 机器人 S1! 这个机器人简直太牛逼了!…

13.JAVAEE之HTTP协议

HTTP 最新的版本应该是 HTTP/3.0 目前大规模使用的版本 HTTP/1.1 使用 HTTP 协议的场景 1.浏览器打开网站 (基本上) 2.手机 APP 访问对应的服务器 (大概率) 学习 HTTP 协议, 重点学习 HTTP 的报文格式 前面的 TCP/IP/UDP 和这些不同, HTTP 的报文格式,要分两个部分来看待.请求…

LeetCode - LCR 008.长度最小的子数组

一. 题目链接 LeetCode - 209. 长度最小的子数组 二. 思路分析 由于此问题分析的对象是「⼀段连续的区间」,因此可以考虑「滑动窗口」的思想来解决这道题。 让滑动窗口满足:从 i 位置开始,窗口内所有元素的和小于target (那么当…

Jenkins构建触发器-Git hook自动触发构建

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Jenkins是一个开源…

c++图论基础(1)

目录 无向图 无向图度 无向图性质 有向图 有向图度 有向图性质 图的分类: 稀疏图: 稠密图: 零图: 有向完全图: 无向完全图: 度序列: 图是由顶点集合(简称点集)和顶点间的边(简称边…

【热议】研究生可以跟导师以外的老师合作吗?

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

Linux 权限与软件包管理器 yum

一. 研究Linux默认权限 目录 ,起始权限:777 普通文件,起始权限666 Linux系统中存在权限掩码 使用umask指令也可以改变掩码 如果将掩码改为0000 我们可以看到权限发生改变(重新设置掩码) 最终权限起始权限 去掉 权限…

安卓悬浮窗权限检查

目录 悬浮窗权限代码检测悬浮窗功能 悬浮窗权限 请求了这个权限后&#xff0c;app的权限管理中会有「显示悬浮窗」的权限选项。后面会引导用户去开启这个权限。 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" />代码检测悬浮窗功能…

目标检测算法YOLOv2简介

YOLOv2由Joseph Redmon等人于2016年提出&#xff0c;论文名为&#xff1a;《YOLO9000: Better, Faster, Stronger》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/1612.08242.pdf &#xff0c;项目网页&#xff1a;https://pjreddie.com/darknet/yolov2/ ,YOLO9000可以…

做外贸SOHO需要考虑什么条件?

一、理清基本的外贸业务 不想给大家泼冷水&#xff0c;但如果你连基本的外贸知识都不懂&#xff0c;不知道业务怎么进行&#xff0c;想成功可能性为0&#xff01; 在开始 soho前&#xff0c;你需要先了解以下几个方面&#xff1a; 1.产品定位(选品) 2.你的供应商资源(选厂) 3.…

【FreeRTOS】RTOS任务的同步与互斥:(四)事件标志组

【FreeRTOS】RTOS任务的同步与互斥&#xff1a;&#xff08;四&#xff09;事件标志组 事件标志组的概念事件标志组相关 API 函数1. 创建事件标志组2. 设置事件标志位3. 清除事件标志位4. 等待事件标志位 事件标志组案例设计cubeMX配置软件程序设计测试结果 同步与互斥是学习Fr…

图像分类导论:从模型设计到端到端

书籍&#xff1a;An Introduction to Image Classification&#xff1a;From Designed Models to End-to-End Learning 作者&#xff1a;Klaus D. Toennies 出版&#xff1a;Springer Singapore 书籍下载-《图像分类导论》图像分类的传统方法包括在特征空间中进行特征提取和…

深度学习运算:CUDA 编程简介

一、说明 如今&#xff0c;当我们谈论深度学习时&#xff0c;通常会将其实现与利用 GPU 来提高性能联系起来。GPU&#xff08;图形处理单元&#xff09;最初设计用于加速图像、2D 和 3D 图形的渲染。然而&#xff0c;由于它们能够执行许多并行操作&#xff0c;因此它们的实用性…

2024多用户商城系统哪家产品好

在当今激烈的电商竞争中&#xff0c;搭建一个功能强大、性能稳定的多用户商城系统至关重要。针对这一需求&#xff0c;以下是我为您推荐的五款优秀多用户商城系统&#xff0c;它们在功能、定制性、安全性和用户体验方面均表现出色&#xff0c;为您的电商平台搭建提供了可靠的解…