MySQL索引(一)

什么是MySQL索引

MySQL的索引是一种用于加速数据查询的数据库结构。它类似于一本书的目录,通过建立索引,MySQL可以更快速地定位和检索所需的数据,从而提高查询的效率。索引的基本原理是为数据列创建一个数据结构(通常是B树或哈希表),这个数据结构能够快速查找特定值的位置。

MySQL索引的类型

  1. B-Tree索引:这是MySQL中最常用的索引类型,适用于大多数情况。B-Tree索引适用于全键值、键值范围和键前缀的查找。

  2. 哈希索引:哈希索引只支持等值查询,不支持范围查询。它的查找速度非常快,但仅限于精确匹配的查询。

  3. 全文索引:用于全文搜索,特别适合于查找文本内容中的关键词。

  4. 空间索引:用于地理空间数据的查询,例如GIS(地理信息系统)应用。

索引的创建

索引可以在创建表时定义,也可以在表创建后添加。例如:

-- 创建表时定义索引
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50),email VARCHAR(50),INDEX (username)
);-- 表创建后添加索引
CREATE INDEX idx_email ON users (email);

索引的优点

  1. 加速查询速度:索引可以大大减少查询数据时所需的扫描行数,从而提高查询速度。
  2. 提高排序效率:在排序操作中,使用索引可以避免大量的数据重新排序。
  3. 加速连接操作:索引可以加速多表连接(JOIN)操作。

索引的缺点

  1. 占用空间:索引需要额外的存储空间来保存索引结构。
  2. 降低写入速度:在插入、删除和更新数据时,索引需要同步更新,可能会影响写入性能。
  3. 维护成本:索引需要维护,随着数据量的增加,索引的维护成本也会增加。

索引使用的最佳实践

  1. 合理选择索引列:应选择查询频繁的列进行索引,而不是所有列都加索引。
  2. 避免过多索引:过多的索引会影响数据写入性能,应平衡查询优化和写入性能。
  3. 监控和优化:定期监控索引的使用情况,删除不常用或冗余的索引,确保数据库性能最佳。

MySQL 与磁盘交互基本单位

MySQL与磁盘交互的基本单位是页(page)。页是InnoDB存储引擎用于管理和存储数据的最小单位。默认情况下,InnoDB存储引擎的每个页大小为16KB。

页的作用

        数据存储:表中的行数据存储在页中,一个页可以包含多行数据。

        索引存储:索引信息也存储在页中,MySQL会在页中组织索引结构(如B-Tree)。

        缓冲管理:InnoDB使用缓冲池来缓存页,从而减少对磁盘的直接访问,提升性能。

页大小配置

默认情况下,InnoDB页大小为16KB,但可以通过配置项innodb_page_size在MySQL服务器启动时进行调整,支持的页大小包括4KB、8KB、16KB等。调整页大小需要注意以下几点:

  • 性能影响:较大的页大小适用于大数据量的表,因为它可以减少磁盘I/O操作;较小的页大小适用于小数据量的表,可以减少内存消耗。
  • 适用场景:根据应用的具体情况选择合适的页大小。例如,读取大量小数据的应用可以选择较小的页大小,而数据量大且读取频繁的应用可以选择较大的页大小。

页与磁盘交互

  • 读操作:当需要读取数据时,InnoDB会先从缓冲池中查找相应的页。如果缓冲池中没有该页,则从磁盘读取页并加载到缓冲池。
  • 写操作:当需要写入数据时,InnoDB会先将数据写入缓冲池中的页,并标记该页为“脏页”。InnoDB后台线程会将脏页定期刷新(flush)到磁盘上,以确保数据的持久性。

向一个具有主键的表中, 乱序插入数据的时候,发现数据会自动排序

向一个具有主键的表中乱序插入数据时,数据会自动排序,这是由MySQL的InnoDB存储引擎负责的。InnoDB通过使用B-Tree(平衡树)索引结构来存储数据和索引,以确保数据按照主键顺序存储。这种设计优化了查询和检索的效率。

InnoDB如何实现自动排序

  1. B-Tree索引:InnoDB使用B-Tree索引来管理数据。B-Tree是一种平衡树结构,能够快速进行查找、插入、更新和删除操作。每个节点(页)包含多个键值对,节点之间按照键值有序连接。
  2. 聚簇索引:在InnoDB中,每张表都有一个聚簇索引,主键即为聚簇索引。聚簇索引的叶节点存储了实际的行数据,并按照主键顺序排序。
  3. 插入操作:当向表中插入数据时,InnoDB会根据主键值在B-Tree中找到合适的插入位置。如果插入位置所在的页已满,InnoDB会分裂页并重新平衡B-Tree。

为什么采用Page的方案进行磁盘IO交互

MySQL和磁盘进行IO交互时采用Page的方案,而不是逐条记录进行交互,这是为了提高IO效率和性能。以下是原因和好处:

  1. 减少IO次数:磁盘IO的效率主要受限于IO操作的次数而不是单次传输的数据量。通过一次加载一个Page,可以减少访问磁盘的次数。例如,一个Page可能包含多条记录,因此一次IO操作可以读取多个记录,大大减少了后续的IO操作。
  2. 局部性原理:根据局部性原理,访问的数据往往在空间上是邻近的。即用户在查询某条记录后,很可能会查询相邻的记录。通过加载一个Page,很多相邻的记录会同时被加载到内存,从而提高查询效率。
  3. 缓存命中率:加载整个Page到内存中的Buffer Pool可以提高缓存命中率。多个查询操作可以在内存中直接完成,而不需要频繁访问磁盘。
  4. 批量处理效率高:批量读取和写入操作比逐条记录读取和写入更高效。现代硬盘和SSD在处理大块连续数据时性能更佳。

具体示例

假设有一个包含以下主键的表,插入操作如下

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50)
);INSERT INTO users (id, name) VALUES (3, 'Alice');
INSERT INTO users (id, name) VALUES (1, 'Bob');
INSERT INTO users (id, name) VALUES (2, 'Charlie');
INSERT INTO users (id, name) VALUES (5, 'Eve');
INSERT INTO users (id, name) VALUES (4, 'David');

在插入完成后,数据会在B-Tree中自动排序,叶子节点将按照主键顺序存储数据。查询操作如查找id=2时,InnoDB会首先加载包含该记录的Page到Buffer Pool中:

SELECT * FROM users WHERE id=2;

假设这5条记录都保存在一个16KB的Page中:

  • 第一次查找id=2时,整个Page会被加载到Buffer Pool中,完成一次IO操作。
  • 后续查找id=1id=3id=4id=5时,数据已经在内存中,不需要再次进行磁盘IO操作。

局部性原理和IO效率

虽然我们不能保证每次用户查找的数据都在同一个Page中,但根据局部性原理,访问的数据很可能在空间上是邻近的。采用Page的方式大大减少了IO操作次数,提高了整体效率。关键在于:

  • 空间局部性:用户访问某条记录时,很可能会访问其邻近的记录。
  • 时间局部性:近期访问的数据很可能会再次被访问。

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

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

相关文章

MyBatis的注解实现复杂映射开发

xml 配置方式实现复杂映射回顾 ​ 实现复杂映射我们之前可以在映射文件中通过配置来实现,使用注解开发后,我们可以通过 Results 注解,Result 注解,One 注解和 Many 注解组合完成复杂关系的配置。 注解说明Results代替的是标签 …

软考时间;软考和计算机等级考试的区别是什么;计算机职称评审主要考什么证书

目录 软考时间 软考和计算机等级考试的区别是什么 计算机职称评审主要考什么证书 软考时间 <

【csv-parse】使用parse方法的时候来转换为csv字符串时,会导致输出有乱码

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;前端bug记录 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续前进…

【运维实践项目|002】:服务器集群优化与监控项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 1、你是如何选择和部署监控系统的&#xff1f; 2、你是怎样优化服务器资源配置的&#xff1f; …

(Vue3+TS+Volar) 全局组件配置类型声明的最佳实践

实践方案 问题原因&#xff1a;Vue3并没有对自定义全局组件做TS类型支持处理&#xff0c;而是把这个功能转交Volar实现实现原理&#xff1a;利用TypeScript模块扩充技术&#xff0c;对全局组件的类型进行扩充&#xff0c;从而实现对新注册全局组件的类型保护实现步骤&#xff…

java中switch枚举类型enum的用法

目录 一、Java 中 switch 语句和枚举类型的使用 1. 定义枚举类型 2. 使用枚举类型 3. 类型安全和易读性 4. 扩展性和可维护性 总结 数组 &#xff1a; java中的数组是用来存储多个相同类型数据的数据机构&#xff1b;下标从0开始 根据下标查询&#xff1a;数组名[下标] 集…

Vue3组件库开发项目实战——02项目搭建(配置Eslint/Prettier/Sass/Tailwind CSS/VitePress/Vitest)

摘要&#xff1a;在现代前端开发中&#xff0c;构建一个高效、可维护且易于协作的开发环境至关重要。特别是在开发Vue3组件库时&#xff0c;我们需要确保代码的质量、一致性和文档的完整性。本文将带你从0搭建vue3组件库开发环境&#xff0c;以下是配置代码规范、格式化、CSS样…

335_C++_传入自定义数量参数,通过位移,生成唯一标识符key,通过函数返回值,看是占据32位还是64位

quint32 makeKey(int w, int h, quint8 quality, bool equalRatio) : 用于生成一个唯一的键(key) static inline quint32 makeKey(int w, int h, quint8 quality, bool equalRatio){return (w << 20)

通配符正则表达式(RegEXP)

通配符 Linux中通配符是一种特殊字符&#xff0c;用于匹配一组文件名中的某些部分。通配符可以用于文件名的前缀、后缀、中间的一部分等。Linux中常见的通配符包括星号&#xff08;*&#xff09;、问号&#xff08;?&#xff09;和方括号&#xff08;[]&#xff09;&#xff0…

扩散模型diffusion model

一 什么是扩散模型 1.1 现有生成模型 已经有大量的方法证明深度生成模型能够模拟人类的想象思维&#xff0c;生成人类难以分辨真伪的内容&#xff0c;主要方法如下&#xff1a; 1、GAN&#xff1a;用神经网络训练生成器和判别器 GAN 的主要思想&#xff1a; GAN 就是一个互搏的…

49.乐理基础-拍号的类型-单拍子、复拍子

当前写的东西&#xff0c;如果只是想要看懂乐谱的话&#xff0c;它是没什么意义的&#xff0c;就像我们要把 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5。。。称为自然数&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5称为正整…

H5 云商城 file.php 文件上传致RCE漏洞复现

0x01 产品简介 H5 云商城是一个基于 H5 技术的电子商务平台,旨在为用户提供方便快捷的在线购物体验。多平台适配:H5 云商城采用 H5 技术开发,具有良好的跨平台适配性。无论是在电脑、手机还是平板等设备上,用户都可以通过网页浏览器访问和使用云商城,无需安装额外的应用程…

销量?模糊销量?精准销量?如何获取淘宝商品销量数据接口

淘宝爬虫商品销量数据采集通常涉及以下几个步骤&#xff1a; 1、确定采集目标&#xff1a;需要明确要采集的商品类别、筛选条件&#xff08;如天猫、价格区间&#xff09;、销量和金额等数据。例如&#xff0c;如果您想了解“小鱼零食”的销量和金额&#xff0c;您需要设定好价…

vueday1

1.作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中 三元表达式、点语法、数组对应项&#xff0c;方法、点语法方法 1.使用的时候需要存在&#xff0c;需要在data里面声明&#xff0c;如果没有声明会报错 2.ifelse不能用 3.不能在标签属性中使用{{}}插值 <!DO…

【前端】打砖块游戏:实现细节介绍

打砖块游戏:实现细节介绍 在本文中,我将详细介绍如何使用HTML、CSS和JavaScript技术构建一个简单的打砖块游戏。我们将重点讨论游戏的三个核心技术方面:碰撞检测、画图和事件监听。 完整代码我放在:github可以直接拉取代码测试。 游戏概览 打砖块游戏中,玩家通过控制底…

静态住宅IP优缺点总结

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

深入解析Apache Flink核心概念:事件流、状态、事件时间和快照

Apache Flink树立了流处理领域的标杆&#xff0c;其核心支柱——事件流、状态管理、事件时间处理&#xff0c;以及快照机制&#xff0c;共同构成了一个强大而灵活的框架&#xff0c;专为应对大数据的实时和历史分析挑战而设计。以下是关于 Apache Flink 四个核心概念的详细介绍…

涨点神器:即插即用特征融合模块!超低参数,性能依旧SOTA

在写论文时&#xff0c;一些通用性模块可以在不同的网络结构中重复使用&#xff0c;这简化了模型设计的过程&#xff0c;帮助我们加快了实验的迭代速度。 比如在视觉任务中&#xff0c;即插即用的特征融合模块可以无缝集成到现有网络中&#xff0c;以灵活、简单的方式提升神经…

7.STL中string的一些超常用函数 (附习题)

目录 1.find 2.atoi 3.to_string 4.getline 【leetcode 习题】 387.字符串中的第一个唯一字符 125. 验证回文串 1.find 1.查找第一次出现的目标字符串&#xff1a;说明&#xff1a;如果查找成功则输出查找到的第一个位置&#xff0c;否则返回-1&#xff1b; s1.find(s2…

宇宙(科普)

宇宙&#xff08;Universe&#xff09;在物理意义上被定义为所有的空间和时间&#xff08;统称为时空&#xff09;及其内涵&#xff0c;包括各种形式的所有能量&#xff0c;比如电磁辐射、普通物质、暗物质、暗能量等&#xff0c;其中普通物质包括行星、卫星、恒星、星系、星系…