mysql索引及数据库引擎

顺序io(不需要每次都磁盘寻址,效率高),随机io(需要每次都磁盘寻址,效率低)

如何正确的创建合适的索引?

索引是一种分散存储的数据结构


磁盘io特性:每次交互是以页为单位,每页4K数据。innoDB每次和磁盘交互是四页16k数据(InnoDB叶节点data域保存了完整的数据记录相比较MYISAM(因为只存储了叶子节点的指针,所占空间1kb都不到)更能充分利用每次磁盘io)

InnoDB 主键索引存储了完整的数据库记录行,辅助索引仅存储了索引和主键值(这里提供了一种解决海量数据分页问题的思路,例如要取一张千万级别数据的表中5百万到5百万零五十行的记录,如何快速获取,可以先使用辅助索引查询找主键,再通过主键走主键索引获取数据库记录。)

mysql索引底层使用的是B+树,索引所有元素都位于树的叶子节点,相邻叶子节点间有双向指针查找索引时先将根节点load到磁盘中(这是一个磁盘IO过程,比较耗时,)在节点中定位指向下一级节点的指针,三层B+树饱和状态能存储大概2000万个索引

什么叫做聚集索引(聚簇索引)?

就是索引键值的逻辑顺序跟表数据行的物理存储顺序是一致的。(比如字典的目录是按拼音排序的,内容也是按拼音排序的,按拼音排序的这种目录就叫聚集索引)。

MYISAM引擎主键是非聚族索引,索引和数据分开存储的,  不支持事务

InnoDB是主键索引是聚族索引,查询的时候不用回表,少一次磁盘IO;  支持事务

聚族索引,B+树叶子节点不仅包含指针还包含数据

虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

第一个重大区别是InnoDB的数据文件本身就是索引文件。MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

无用的索引会拖垮数据库操作的性能(更新删除新增树的结构要变化,节点内关键字会重排)

myisam引擎中B+树数据库记录行的指针(5.5版本之前的默认引擎)

innodb引擎主键索引叶子节点存储了索引和数据记录(5.5版本之后的默认引擎)

列的离散性越高,选择性就越好(离散型太低还不如全表扫描,不适合建立索引)

离散性太差,mysql可能自动不选择索引(由mysql的查询优化器实现)

前缀索引:当需要给长度很长的字符串字段加索引时,可以使用前缀索引,给字符串的前几个字符位加索引,需要先判断一下前几位字符的离散度也就是重复率。

联合索引:选择原则:

1、经常用的列优先(最左匹配原则)

2、选择性(离散度)高的列优先(离散型高原则)

3、宽度小的列优先(最少空间原则)

覆盖索引

1、如果查询里可通过索引节点中的关键字直接返回,则称为覆盖索引

例 user表中 联合索引为name+age  查询语句为select name, age from user where name=?

则为覆盖索引,直接返回叶子节点位置的数据,不用再回表,大大减少磁盘io,提高性能(这就是为什么公司不让使用select * ,有可能命中覆盖索引,只返回必要的数据,减少数据包的大小,降低数据传输的开销)


索引失效的情况

1.where条件中not in、or和<>操作无法使用索引(离散型太差);

2.复合索引未用左列字段;

3.like以%开头;

4.需要类型转换;

5.where中索引列有运算;

6.where中索引列使用了函数;

7.如果mysql觉得全表扫描更快时(数据少,离散型差等情况);

插拔式存储引擎

CSV存储引擎

(数据存储以CSV文件格式)

特点:不能定义没有索引、列定义必须为not null 、不能设置自增列

-->不适用大表或者数据的在线处理

CSV数据的存储用逗号隔开,可直接编辑CSV文件进行数据的编排

-->数据安全性低

应用场景:数据的快速导入导出,表格直接装换成CSV

Archive存储引擎

压缩协议进行数据的存储(ARZ文件格式)

特点:只支持insert和select两种操作,只允许自增id建立索引,行级锁,不支持事务,数据占用磁盘少

应用场景:日志系统,大量的设备数据采集

Memory存储引擎(heap存储引擎)

Myisam存储引擎

特点:select count(*) from table无需进行数据的扫描

        数据(MYD)和索引(MYI)分开存储

      表级锁

      不支持事务

Innodb(5.5版本后的默认存储引擎)

            支持事务、 行级锁、聚集索引,支持外键

最后编辑于:2025-04-21 10:57:35


喜欢的朋友记得点赞、收藏、关注哦!!!

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

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

相关文章

网络安全:sql注入练习靶场——sqli_labs安装保姆级教程

网络安全&#xff1a;sql注入练习靶场——sqli_labs安装保姆级教程 前言 sqli-labs靶场是一个开源的sql注入练习的综合靶场&#xff0c;包含大部分sql注入漏洞以及注入方式 网络安全学习者可以通过在sqli-labs靶场练习提升对sql注入的理解&#xff0c;以及学习各种绕过姿势。…

平台介绍-开放API接口-鉴权

平台的理念是一个组织内部只建一套系统。但是现实情况是&#xff0c;组织内部已经建立了很多系统&#xff0c;是不能一次性替代的&#xff0c;只能先搭起平台&#xff0c;然后逐步开始替换。这样就不可避免的存在其他系统和平台进行交互的问题。 平台为此设计了开放API接口。其…

多端定制系统开发:打造高效全平台覆盖的APP解决方案

在移动互联网时代&#xff0c;用户需求日益多样化&#xff0c;企业若想触达更广泛的受众&#xff0c;仅靠单一平台的应用已远远不够。无论是iOS、Android、Web端&#xff0c;还是智能手表、车载设备等新兴终端&#xff0c;多端适配已成为企业数字化转型的刚需。多端定制系统开发…

Linux电源管理(5)_Hibernate和Sleep功能介绍

原文&#xff1a;Linux电源管理(5)_Hibernate和Sleep功能介绍 1. 前言 Hibernate和Sleep两个功能是Linux PM的核心功能&#xff0c;它们的目的是类似的&#xff1a;暂停使用——>保存上下文——>关闭系统以节电>恢复系统——>恢复上下文——>继续使用。 本文…

Spring 命名空间注入:p、c 与 .util 的深度解析

在 Spring 框架的开发过程中&#xff0c;XML 配置是一种常见且强大的方式来管理 Bean。为了让配置更加简洁、易读&#xff0c;Spring 提供了多种命名空间注入的方法&#xff0c;其中 p 命名空间注入、c 命名空间注入和 .util 命名空间尤为重要。本文将详细介绍这三种命名空间的…

RUST变量学习笔记

1&#xff0c;作用域概念 捕获环境 2&#xff0c;所有权概念 Rust则是通过所有权和借用来保证内存安全。很多人不理解为啥说Rust是内存安全的&#xff0c;其实就是在默认情况下&#xff0c;你是写不出内存不安全的代码的。 Rust的所有权并不难理解&#xff0c;它有且只有如下…

探索 Spring AI 的 ChatClient API:构建智能对话应用的利器

探索 Spring AI 的 ChatClient API&#xff1a;构建智能对话应用的利器 前言 在当今人工智能蓬勃发展的时代&#xff0c;智能对话系统成为了众多应用的核心组成部分。无论是客服机器人、智能助手还是聊天应用&#xff0c;都离不开高效、灵活的对话处理能力。Spring AI 作为 S…

开源ERP系统对比:Dolibarr、ERPNext与Odoo

对于寻求开源ERP解决方案的企业而言&#xff0c;Dolibarr、ERPNext和Odoo是三个备受关注的选择。它们各自拥有独特的优势和特点&#xff0c;适用于不同规模和需求的组织。以下是对这三个系统的详细介绍和对比&#xff0c;以帮助您更好地理解它们的差异&#xff0c;并结合中文支…

【2025年】MySQL面试题总结

文章目录 1. MySQL 支持哪些存储引擎&#xff1f;默认使⽤哪个&#xff1f;2. MyISAM 和 InnoDB 有什么区别&#xff1f;3. 事务的四大特性?4. 并发事务带来了哪些问题?5. 不可重复读和幻读有什么区别&#xff1f;6. MySQL 事务隔离级别&#xff1f;默认是什么级别&#xff1…

Linux常用命令29——delgroup删除组

在使用Linux或macOS日常开发中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;delgroup 是用于删除用户组的一个命令。此命令通常由超级用户&#xff08;root&#xff09;运行&#xff0c;或者通过 sudo 提权来操作。本篇学习记录delgroup命令的基本使用。 下面…

字节暑期实习-网络运维工程师面经

岗位描述 这个是ByteIntern实习&#xff0c;是暑期实习岗位 岗位 一面 先自我介绍 抓项目技术&#xff08;会进行确认是什么技术&#xff09; TCP的三次握手和四次挥手 序列号和确认应答号的位置和大小 序列号是随机的吗&#xff1f; 序列号为什么是随机的&#xff1f; …

5.3刷题

P3370 【模板】字符串哈希 #include<bits/stdc.h> using namespace std; #define int long long typedef unsigned long long ull; int n; ull myhash(string s){ull code 0, x 131, y 140814840257324663;for(int i 0; i < s.size(); i){code (code * x (ull)…

Kettle下载安装教程

## 什么是Kettle Kettle&#xff08;现在也称为Pentaho Data Integration&#xff0c;简称PDI&#xff09;是一款开源的ETL&#xff08;Extract-Transform-Load&#xff09;工具&#xff0c;用于数据抽取、转换和加载。它允许用户通过图形化界面设计和执行数据集成流程&#xf…

FreeRtos实战从入门到精通--任务创建和删除(动态方法)--事了拂衣去,深藏功与名

FreeRtos是之前的一些聪明的工程师写的免费且开源的嵌入式实时操作系统代码&#xff0c;由于我们实际工作中不需要再去写rtos&#xff0c;我们只需要用就行了&#xff0c;所以博主这里只分享项目工程实战相关的内容&#xff0c;具体rtos源码&#xff0c;可以无需理会&#xff0…

Java通用Mapper自定义方法

目录 一、定义通用 Mapper 接口二、继承通用 Mapper 实现自定义方法三、注册自定义 Mapper 接口四、在实体类对应的 Mapper 接口中使用自定义方法五、实现自定义方法的 SQL 逻辑注解方式XML 映射文件方式六、使用自定义方法七、注意事项在 Java 持久层开发中,MyBatis 的通用 M…

Android WebRTC回声消除

文章目录 安卓可用的回声消除手段各种回声消除技术优缺点WebRTC回声消除WebRTC回声消除回声消除处理流程WebRTC AECM APP 安卓可用的回声消除手段 硬件回声消除 使用 AudioRecord 的 VOICE_COMMUNICATION 模式&#xff1a;通过 AudioRecord 的 VOICE_COMMUNICATION 音频源可以…

基于 SAFM 超分辨率上采样模块的 YOLOv12 改进方法—模糊场景目标检测精度提升研究

在复杂视觉环境中,如低光照、雾天或远距离拍摄等场景下,图像质量下降导致目标模糊,使得传统目标检测模型难以实现高精度识别。YOLO系列作为主流单阶段检测框架,在速度和精度方面表现出色,但在模糊和小目标场景中仍存在性能瓶颈。本文提出一种面向 YOLOv12 的创新性改进方法…

Spring 事务的底层原理常见陷阱

一、Spring 事务的底层原理 1. 核心机制 动态代理&#xff08;AOP&#xff09;&#xff1a; Spring 通过动态代理&#xff08;JDK 或 CGLIB&#xff09;生成代理对象&#xff0c;拦截被 Transactional 注解标记的方法。事务拦截器&#xff1a; TransactionInterceptor 负责管…

Java SE(6)——类和对象(一)

1.初始面向对象 1.1 什么是面向对象 Java是一门纯面向对象的编程语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交换来完成一件事情 1.2 面向过程…

cpp细碎知识点

1 重写 (Override): 派生类中定义一个与基类虚函数具有相同函数签名&#xff08;函数名、参数列表、返回类型&#xff09;的函数&#xff0c;这被称为重写。 重写意味着派生类提供了基类虚函数的一个特定于派生类的实现。 重写是实现多态的关键 2 虚基类 (Virtual Base Class…