MySQL存储引擎、索引、索引失效

news2025/1/14 2:05:59

MySQL

Docker 安装 MySQL8.0,安装见docker-compose.yaml

操作类型

SQL 程序语言有四种类型,对数据库的基本操作都属于这四种类,分为 DDL、DML、DQL、DCL

  1. DDL(Dara Definition Language 数据定义语言),是负责数据结构定义与数据对象定义的语言,由 create、alter、drop、truncate 四个语法组成

    • create table 创建表
    • alter table 修改表
    • drop table 删除表
    • truncate table 清空表
  2. DML(Data Manipulation Language 数据操纵语言),主要是进行插入数据、修改数据、删除数据的操作,由 insert、update、delete 语法组成

  3. DQL(Data Query Language 数据查询语言),用来进行数据库中的数据查询,最常用的就是 select 语句

  4. DCL(Data Control Language 数据控制语言),用来授权或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,能够对数据库进行监视

存储过程

MySQL数据存储位置可以通过SHOW VARIABLES LIKE 'datadir';去获取,每一个数据库都会有一个文件,每一张表都会有一个*.ibd文件,这个文件存储着表数据、索引、UNDO日志等等…

表空间文件结构

表空间有文件头(File Header)、段(Segment)、区(Extent)、页(Page)

  1. 段(Segment),段是表空间的逻辑分区,用于管理不同类型的数据,如表的数据段索引段、溢出段等
  2. 区(Extent),每个区由多个连续的页组成,默认大小为 1MB(即 64 个连续的 16KB 页)
  3. 页(Page),页是 InnoDB 表空间文件的基本存储单元,每页存储不同的数据内容,如行数据、索引、回滚信息等
  4. 行(Row),行是表中数据的基本逻辑单位,代表每一条记录;记录以特定格式存储在数据页中,并包含实际的列值、元信息(如事务 ID、回滚指针等)

请添加图片描述

数据页结构

数据库I/O操作的最小单位是页,与数据库相关的内容都会存储在页结构里。数据页包括七个部分,分别是文件头(File Header)、页头(Page Header)、最大最小记录(Infimum+supremum)、用户记录(User Records)、空闲空间(Free Space)、页目录(Page Directory)和文件尾(File Tailer)

请添加图片描述

请添加图片描述

行(Row)格式分类

MySQL 支持以下几种行格式,具体格式由表的 ROW_FORMAT 定义:Compact(紧凑格式)、Redundant(冗余格式,MySQL 早期版本的默认格式)、Dynamic(动态格式)、Compressed(压缩格式)

CREATE TABLE example (
    id INT,
    name VARCHAR(255)
) ENGINE=InnoDB ROW_FORMAT=COMPACT;

以Compact为例

字段内容说明
行头信息INFO_BITS, HEAP_NO 等用于管理行的元信息
隐藏列TRX_ID, ROLL_PTR 等用于支持事务和回滚
用户数据id=1定长数据直接存储
用户数据name=‘Alice’包括长度前缀和实际数据
用户数据age=30定长数据直接存储
用户数据bio 指向溢出页如果数据过大,存储在溢出页

存储引擎

可以通过SELECT * FROM INFORMATION_SCHEMA.ENGINES;查询数据库支持存储引擎,常见的存储引擎有InnoDB、MyISAM

请添加图片描述

InnoDB 存储引擎

InnoDB是现在默认的存储引擎,具体参考官方文档

  1. 事物支持

    • 支持事物,遵循ACID特性
  2. 行级锁

    • 采用行级锁,支持高并发
    • 结合多版本并发控制(MVCC),减少锁争用
  3. 外键约束

    • 支持外键约束,确保数据一致性和完整性
  4. 崩溃恢复

    • 使用 Redo Log 和 Undo Log 来确保数据在系统崩溃后可以恢复
  5. 索引

    • 聚簇索引(Clustered Index)存储数据,主键索引和行数据一起存储
    • 辅助索引,辅助索引存储索引键和指向主键的引用,回表

MyISAM 存储引擎

MyISAM存储引擎是基于较旧的ISAM存储引擎的扩展,具体参考官方文档

  1. 无事物支持
  2. 表级锁
  3. 高效读操作
  4. 非聚簇索引,数据和索引分开存储
  5. 压缩表
  6. 不支持外键

选择存储引擎

  1. 如果系统需要 事务支持、高并发写入、数据一致性(如银行、订单系统)
    选择 InnoDB

  2. 如果系统以 读操作为主、不需要事务支持(如报表系统、数据统计)
    选择 MyISAM

索引

索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构,索引的作用就相当于书的目录

索引分类

  1. 按照存储方式划分

    • 聚簇索引:索引结构和数据存一起存放的索引(InnoDB中的主键索引)
    • 非聚簇索引:索引结构和数据分开存放的索引,如二级索引,MyISAM引擎下的索引
  2. 按照应用维度划分

    • 主键索引:加速查询 + 列值唯一(不可以有 NULL)+ 表中只有一个
    • 普通索引:仅加速查询
    • 唯一索引:加速查询 + 列值唯一(可以有 NULL)
    • 覆盖索引:一个索引包含(或者说覆盖)所有需要查询的字段的值
    • 联合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
    • 全文索引:对文本的内容进行分词,进行搜索
  3. 按照数据结构划分

    • BTree 索引:最常用的索引类型,叶子节点存储value
    • 哈希索引:类似键值对的形式,一次即可定位
    • 全文索引:对文本的内容进行分词,进行搜索

BTree

B-Tree(Balanced Tree,平衡树)是一种自我平衡的树数据结构,保持数据有序,时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)

比较项BTreeB+Tree
数据存储位置数据存储在叶子节点和非叶子节点数据仅存储在叶子节点
索引节点存储内容键和值仅存储键
范围查询效率较低,需遍历多个节点高效,叶子节点形成链表
顺序遍历需要中序遍历整棵树通过叶子节点链表直接遍历
树高度较高(非叶子节点存储更多数据)较低(非叶子节点存储更少数据)
适用场景一般的搜索和存储场景数据库索引、文件系统的最佳选择

数据库使用B+Tree的优势

  • 更高效的磁盘 IO:非叶子节点占用更少的存储空间,能减少磁盘读取次数,提高性能。
  • 更快的范围查询:叶子节点形成链表,适合处理范围查询和排序查询。
  • 易于维护:插入和删除操作的复杂度较低,树的平衡性易维护。
  • 良好的扩展性:能适应大规模数据和高并发场景。

索引失效

  1. 字段类型隐式转换

    -- 索引失效
    SELECT * FROM user WHERE id = '1';
    -- 索引生效
    SELECT * FROM user WHERE id = 1;
    
  2. 索引列参与运算

    -- 索引失效
    SELECT * FROM user WHERE id + 1 = 10;
    -- 索引生效
    SELECT * FROM user WHERE id = 10;
    
  3. 索引列使用函数

    -- 索引失效
    SELECT * FROM users WHERE SUBSTR(name, 1, 3) = 'Tom'
    -- 索引生效
    SELECT * FROM users WHERE name = 'Tom'
    
  4. 索引列使用like,且%在前面

    -- 索引失效
    SELECT * FROM users WHERE name LIKE '%Tom%'
    -- 索引生效
    SELECT * FROM users WHERE name = 'Tom'
    
  5. 数据量比较少,优化器不走索引

  6. 索引列使用!=、<>、!<、!>、NOT IN、NOT LIKE、NOT BETWEEN、IS NOT NULL

    -- 索引失效
    SELECT * FROM users WHERE id != 1;
    -- 索引生效
    SELECT * FROM users WHERE id = 1;
    
  7. 容易误解的地方是 <、> 走不走索引,在MySQL8.0中,<、> 针对数字类型走索引会走索引

    • 当匹配的数据量超过表总数据量的20%-30%时,优化器倾向于选择全表扫描,索引也会失效
  8. 索引列使用OR

  9. 索引列使用复合索引, 违反最左前缀原则

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

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

相关文章

WPF基础(1.1):ComboBox的使用

本篇文章介绍ComboBox的基本使用。 本篇文章的例子实现的功能&#xff1a;后端获取前端复选框中的选项之后&#xff0c;点击“确定”按钮&#xff0c;弹出一个MessageBox&#xff0c;显示用户选择的选项。 文章目录 1. 效果展示2. 代码逻辑2.1 前端代码2.2 后端代码 1. 效果展…

前端炫酷动画--文字(二)

目录 一、弧形边框选项卡 二、零宽字符 三、目录滚动时自动高亮 四、高亮关键字 五、文字描边 六、按钮边框的旋转动画 七、视频文字特效 八、立体文字特效让文字立起来 九、文字连续光影特效 十、重复渐变的边框 十一、磨砂玻璃效果 十二、FLIP动画 一、弧形边框…

android 官网刷机和线刷

nexus、pixel可使用google官网线上刷机的方法。网址&#xff1a;https://flash.android.com/ 本文使用google线上刷机&#xff0c;将Android14 刷为Android12 以下是失败的线刷经历。 准备工作 下载升级包。https://developers.google.com/android/images?hlzh-cn 注意&…

25/1/12 嵌入式笔记 学习esp32

了解了一下位选线和段选线的知识&#xff1a; 位选线&#xff1a; 作用&#xff1a;用于选择数码管的某一位&#xff0c;例如4位数码管的第1位&#xff0c;第2位&#xff09; 通过控制位选线的电平&#xff08;高低电平&#xff09;&#xff0c;决定当前哪一位数码管处于激活状…

探秘block原理

01 概述 在iOS开发中&#xff0c;block大家用的都很熟悉了&#xff0c;是iOS开发中闭包的一种实现方式&#xff0c;可以对一段代码逻辑进行封装&#xff0c;使其可以像数据一样被传递、存储、调用&#xff0c;并且可以保存相关的上下文状态。 很多block原理性的文章都比较老&am…

【Docker】入门教程

目录 一、Docker的安装 二、Docker的命令 Docker命令实验 1.下载镜像 2.启动容器 3.修改页面 4.保存镜像 5.分享社区 三、Docker存储 1.目录挂载 2.卷映射 四、Docker网络 1.容器间相互访问 2.Redis主从同步集群 3.启动MySQL 五、Docker Compose 1.命令式安装 …

Bootstrap 前端 UI 框架

Bootstrap官网&#xff1a;Bootstrap中文网 铂特优选 Bootstrap 下载 点击进入中文文档 点击下载 生产文件是开发响应式网页应用&#xff0c;源码是底层逻辑代码&#xff0c;因为是要制作响应式网页&#xff0c;所以下载开发文件 引入 css 文件&#xff0c; bootstrap.css 和 …

Docker与微服务实战2-基础篇

1.学习一门新技术的理念 1.是什么 2.能干吗 3.去哪下载 4.怎么玩 5.永远的helloworld跑起来一次 AB法则 before 与 after 的对比 2.为什么会有Docker出现 3.docker理念 解决了运行环境和配置问题的软件容器&#xff0c;方便做持续集成并有助于整体发布的容器虚拟化…

蓝桥杯_B组_省赛_2022(用作博主自己学习)

题目链接算法11.九进制转十进制 - 蓝桥云课 进制转换 21.顺子日期 - 蓝桥云课 时间与日期 31.刷题统计 - 蓝桥云课 时间与日期 41.修剪灌木 - 蓝桥云课 思维 51.X 进制减法 - 蓝桥云课 贪心 61.统计子矩阵 - 蓝桥云课 二维前缀和 71.积木画 - 蓝桥云课 动态规划 82.扫雷 - 蓝桥…

CES 2025|美格智能高算力AI模组助力“通天晓”人形机器人震撼发布

当地时间1月7日&#xff0c;2025年国际消费电子展&#xff08;CES 2025&#xff09;在美国拉斯维加斯正式开幕。美格智能合作伙伴阿加犀联合高通在展会上面向全球重磅发布人形机器人原型机——通天晓&#xff08;Ultra Magnus&#xff09;。该人形机器人内置美格智能基于高通QC…

PyMysql 01|(包含超详细项目实战)连接数据库、增删改查、异常捕获

目录 一、数据库操作应用场景 二、安装PyMysql 三、事务的概念 四、数据库的准备 五、PyMysql连接数据库 1、建立连接方法 2、入门案例 六、PyMysql操作数据库 1、数据库查询 1️⃣查询操作流程 2️⃣cursor游标 ​3️⃣查询常用方法 4️⃣案例 5️⃣异常捕获 …

了解Node.js

Node.js是一个基于V8引擎的JavaScript运行时环境&#xff0c;它允许JavaScript代码在服务器端运行&#xff0c;从而实现后端开发。Node.js的出现&#xff0c;使得前端开发人员可以利用他们已经掌握的JavaScript技能&#xff0c;扩展技能树并成为全栈开发人员。本文将深入浅出地…

Unreal Engine 5 (UE5) Metahuman 的头部材质

在图中&#xff0c;你展示了 Unreal Engine 5 (UE5) Metahuman 的头部材质部分&#xff0c;列出了头部材质的多个元素。以下是对每个部分的解释&#xff1a; 材质解释 Element 0 - MI_HeadSynthesized_Baked 作用&#xff1a; 这是 Metahuman 的主要头部材质&#xff0c;控制整…

《自动驾驶与机器人中的SLAM技术》ch7:基于 ESKF 的松耦合 LIO 系统

目录 基于 ESKF 的松耦合 LIO 系统 1 坐标系说明 2 松耦合 LIO 系统的运动和观测方程 3 松耦合 LIO 系统的数据准备 3.1 CloudConvert 类 3.2 MessageSync 类 4 松耦合 LIO 系统的主要流程 4.1 IMU 静止初始化 4.2 ESKF 之 运动过程——使用 IMU 预测 4.3 使用 IMU 预测位姿进…

SQL从入门到实战-2

高级语句 窗口函数 排序窗口函数 例题二十九 select yr,party,votes, rank() over (PARTITION BY yr ORDER BY votes desc) as pson from ge where constituency S14000021 order by party,yr 偏移分析函数 例题三十 select name,date_format(whn,%Y-%m-%d) data, confi…

Spring Security单点登录

本文介绍了Spring Security单点登录的概念和基本原理。单点登录是指用户只需登录一次&#xff0c;即可在多个相互信任的系统中实现无缝访问和授权。通过Spring Security框架的支持&#xff0c;可以实现有效的用户管理和权限控制。最后&#xff0c;本文提供了实际应用案例&#…

LKT4304新一代算法移植加密芯片,守护物联网设备和云服务安全

凌科芯安作为一家在加密芯片领域深耕18年的企业&#xff0c;主推的LKT4304系列加密芯片集成了身份认证、算法下载、数据保护和完整性校验等多方面安全防护功能&#xff0c;可以为客户的产品提供一站式解决方案&#xff0c;并且在调试和使用过程提供全程技术支持&#xff0c;针对…

浅谈云计算04 | 云基础设施机制

探秘云基础设施机制&#xff1a;云计算的基石 一、云基础设施 —— 云计算的根基![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1fb7ff493d3c4a1a87f539742a4f57a5.png)二、核心机制之网络&#xff1a;连接云的桥梁&#xff08;一&#xff09;虚拟网络边界&#xff…

Qt C++读写NFC标签NDEF网址URI

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1biFgjSs&ftt&id615391857885 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include "QLibrary" …

Java 如何传参xml调用接口获取数据

传参和返参的效果图如下&#xff1a; 传参&#xff1a; 返参&#xff1a; 代码实现&#xff1a; 1、最外层类 /*** 外层DATA类*/ XmlRootElement(name "DATA") public class PointsXmlData {private int rltFlag;private int failType;private String failMemo;p…