MySQL 的性能调优(第一部分)

MySQL 性能调优——SQL 优化 随着业务的不断增长,数据库中的数据也会越来越多,数据库的压力会越来越大,我们会发现,在业务繁忙的时候,数据库的性能会直线下降,这时为了保证良好的性能,需要想办法分担数据库的压力。分担数据库的读负载可以使用主从复制的方式,增加只读从数据库,通过读写分离的方式把数据库的读负载分担到不同的从数据库中,这时在一段时间内已经可以解决问题了。随着业务的发展,会发现,单一的主数据库已经无法承担写负载了,那么这时就需要对单一的主数据库进行拆分了。 阅读详情

一、什么是索引?

在关系型数据库中,索引是一种特殊的数据结构,它将数据按照特定规则进行预排序和组织,能够帮助数据库系统快速定位到目标数据记录,从而显著提升数据库表中数据的查找和访问速度。

生活中的类比

  • 📚 书籍目录:快速找到特定章节

  • 📁 文件标签:快速定位文件位置

  • 🏢 房间编号:快速找到具体房间

  • 🏷️ 商品标签:快速分类检索商品

核心思想

以空间换时间:通过额外的存储空间来存储索引数据,从而换取查询性能的指数级提升。

二、索引的分类体系

MySQL 中的索引是在存储引擎层实现的,不同存储引擎支持不同的索引类型。

1. 按数据结构分类

  • B+Tree索引(最重要,最常用)

  • Hash索引(Memory引擎支持)

  • Full-text索引(全文搜索)

2. 按物理存储分类

  • 聚集索引(Clustered Index):数据行与索引一起存储

  • 非聚集索引(Non-clustered Index):索引与数据行分开存储

3. 按字段特性分类

索引类型

关键字

特点

是否允许空值

主键索引

PRIMARY KEY

唯一标识,一张表只有一个

不允许

唯一索引

UNIQUE

确保列值唯一

允许一个NULL

普通索引

INDEX

最基本的索引类型

允许

全文索引

FULLTEXT

用于全文搜索

允许

4. 按字段个数分类

  • 单列索引:只包含一个字段

  • 联合索引(复合索引/组合索引):包含多个字段

三、索引数据结构演进与对比

🌳 数据结构演进图谱

二叉树 → 红黑树 → B树 → B+树

1. 二叉树

graph TD
    A[50] --> B[30]
    A --> C[70]
    B --> D[20]
    B --> E[40]
    C --> F[60]
    C --> G[80]

特点:

  • 每个节点最多两个子节点

  • 左子节点 < 父节点 < 右子节点

  • 数据随机时效率尚可,但有序插入时退化为链表

问题场景:当数据有序插入时(1,2,3,4,5...)

1
 \
  2
   \
    3
     \
      4
       \
        5

退化为链表,查询时间复杂度 O(n)

2. 红黑树(平衡二叉树)

优化点:

  • 通过自旋保持平衡

  • 避免极端情况下的链表化

  • 树高度相对稳定

局限性:

  • 每个节点仍然只有两个子节点

  • 数据量大时,树的高度仍然很高

  • 每层深度增加 = 磁盘I/O次数增加

3. B树(多路平衡查找树)

graph TD
    A[10, 20, 30] --> B[5, 8]
    A --> C[15, 18]
    A --> D[25, 28]
    A --> E[35, 40]

突破性改进:

  • 一个节点可以有 M 个子节点(M>2)

  • 每个节点存储多个键值

  • 显著降低树的高度

3阶B树示例:

[20, 40]
        /    |    \
   [10,15] [25,30] [50,60]

4. B+树(MySQL的选择)

graph TD
    subgraph "非叶子节点(只存键)"
        A[P1: 10, P2: 20]
    end
    
    A --> B[P3: 5, P4: 8]
    A --> C[P5: 15, P6: 18]
    A --> D[P7: 25, P8: 28]
    
    subgraph "叶子节点(存数据+指针)"
        B1[5 → 数据A]
        B2[8 → 数据B]
        C1[15 → 数据C]
        C2[18 → 数据D]
        D1[25 → 数据E]
        D2[28 → 数据F]
    end
    
    B --> B1
    B --> B2
    C --> C1
    C --> C2
    D --> D1
    D --> D2
    
    B1 --> B2
    B2 --> C1
    C1 --> C2
    C2 --> D1
    D1 --> D2

四、为什么MySQL选择B+树?

B树 vs B+树 核心区别

特性

B树

B+树

非叶子节点存储

键值 + 数据

仅键值(指针)

叶子节点存储

键值 + 数据

键值 + 数据

叶子节点连接

无连接

双向链表连接

数据位置

所有节点

仅叶子节点

查找稳定性

不稳定

稳定(都要到叶子节点)

空间利用率

较低

更高

B+树的三大优势

✅ 1. 更矮的树,更少的磁盘I/O
假设:
- 每个节点大小为16KB
- 每个指针8字节
- 主键为bigint(8字节)

B+树非叶子节点容量 = 16KB / (8+8) ≈ 1024个键值
三层B+树可存储 = 1024² ≈ 100万条记录
✅ 2. 高效的范围查询
-- 查找年龄20-30的用户
SELECT * FROM users WHERE age BETWEEN 20 AND 30;

由于叶子节点是双向链表连接,只需要找到起始点,然后顺序遍历即可。

✅ 3. 排序和分组优化
-- 按年龄排序
SELECT * FROM users ORDER BY age;

-- 按城市分组
SELECT city, COUNT(*) FROM users GROUP BY city;

索引本身有序,天然支持排序和分组操作。

五、面试精华:深度问题解析

❓ 高频面试题1:为什么B+树比B树更适合数据库索引?

参考答案:

  1. 更高的扇出,更少的I/O:B+树非叶子节点只存键值,不存数据,所以每个节点能存储更多键值,树更矮

  2. 范围查询优势:叶子节点双向链表,范围查询效率极高

  3. 查询稳定:每次查询都要到叶子节点,时间复杂度稳定在O(log n)

  4. 更适合磁盘存储:充分利用局部性原理,减少磁盘随机I/O

❓ 高频面试题2:如果没有主键索引,还会创建B+树吗?

深度解析:

-- 示例:创建无主键表
CREATE TABLE no_pk_table (
    id INT,
    name VARCHAR(50),
    age INT
) ENGINE=InnoDB;

答案是:会的!

InnoDB的实现机制:

  1. 隐藏主键:如果表没有显式定义主键,InnoDB会自动创建一个6字节的隐藏主键DB_ROW_ID

  2. 强制索引:InnoDB要求每个表必须有聚集索引

  3. 回退选择:

    • 优先使用主键

    • 没有主键则使用第一个非空的唯一索引

    • 都没有则使用隐藏的DB_ROW_ID创建聚集索引

-- 验证隐藏主键
SHOW CREATE TABLE no_pk_table;
-- 或
SELECT * FROM information_schema.INNODB_SYS_TABLES 
WHERE NAME LIKE '%no_pk_table%';

六、实战优化建议

1. 索引设计原则

-- ✅ 好的设计
CREATE INDEX idx_name_age ON users(name, age);

-- ❌ 避免过度索引
-- 每个索引都需要维护,增删改时会降低性能

2. 联合索引最左匹配原则

-- 索引: (a, b, c)
WHERE a = 1 AND b = 2 AND c = 3  -- ✅ 全用
WHERE a = 1 AND b = 2           -- ✅ 用a,b
WHERE a = 1                    -- ✅ 用a
WHERE b = 2 AND c = 3          -- ❌ 无法用索引
WHERE b = 2                    -- ❌ 无法用索引

3. 索引使用注意事项

  • 小表不需要索引(全表扫描可能更快)

  • 区分度低的字段不适合建索引(如性别)

  • 频繁更新的字段谨慎建索引

  • 使用覆盖索引减少回表查询

总结

MySQL索引是一个以空间换时间的经典设计,B+树作为其核心数据结构,通过精巧的设计平衡了查询效率、范围查询、排序分组等多种需求。理解索引的底层原理,能够帮助我们在实际工作中更好地设计数据库结构,编写高效的SQL语句,进行有效的性能调优。

掌握索引,就掌握了数据库性能优化的钥匙!🔑


mysql 调优学习笔记 今天开始学习mysql调优啦 (偶那东一榔头西一棒子的学习历程的又一棒子) 好啦,言归正传:  首先,mysql调优有三个主要的方式,由低到高分别是: 1、硬件调优 2、修改mysql进程 3、优化mysql查询 一、硬件调优        先看看硬件调优吧。这个有两方面你可以考虑,首先对现有硬件条件进行修复,能调整的调整,能替换的替换,例如你可以把中央处理器(CPU)或磁盘速度 阅读详情

相关推荐

解读MySQL性能调优“金字塔”

计算机是一种实验的科学 性能优化是实战的艺术 蒸汽机的改进不是一蹴而就的,MySQL性能的改进也是贯穿整个MySQL发展史的。MySQL之父Monty在1981年写了MySQL的第一行代码以后,在开源的帮助下MySQL成长为目前最流行的开源数据库,同样其也凝聚了非常多的开发者、DBA、工程师的...

Jack_Roc的博客 1591

Mysql性能调优笔记(第一部分)

项目后台用mysql存储数据,开始运行时数据量比较少,各个页面查询的性能都比较可观,所以没有关心性能的问题,然而慢慢的数据量越来越大,开始发现首页和一些查询页面的性能明显不容乐观,早上也给领导做了一次展示,其余功能实现都不错,就是查询的性能有待提高。 对于mysql调优自己没有什么经验,苦思之余想起了吴老,我是吴老光荣之路的学生,之前做dubbo的接口测试也是没有思路向吴老询问参考了他给的一

liu870915的专栏 409

MySQL调优

MySQL调优基本介绍

啊Q老师 3758

mysql skip remarks_Mysql性能调优笔记(第一部分)

吴老的《selenium webdriver 实战宝典》出版了!项目后台用mysql存储数据,开始运行时数据量比较少,各个页面查询的性能都比较可观,所以没有关心性能的问题,然而慢慢的数据量越来越大,开始发现首页和一些查询页面的性能明显不容乐观,早上也给领导做了一次展示,其余功能实现都不错,就是查询的性能有待提高。对于mysql调优自己没有什么经验,苦思之余想起了吴老,我是吴老光荣之路的学生,之前做...

weixin_32821251的博客 134

[FPGA高速以太网]基于Verilog与1G/2.5G Ethernet PCS/PMA IP核的2.5G UDP通信实战

本文详细介绍了基于FPGA与1G/2.5G Ethernet PCS/PMA IP核实现2.5G UDP通信的完整实战方案。文章以黑金AX7A200开发板为硬件平台,深入讲解了从硬件选型、IP核配置、Verilog测试逻辑编写到系统调试与性能验证的全过程,重点剖析了利用SGMII接口与GTP收发器实现高速数据传输的关键技术与避坑指南,为FPGA高速以太网应用开发提供了宝贵经验。

sql99的博客 567

【Unity+HoloLens2】从0开始在HoloLens2部署MR工程

HoloLens2部署的权威教程在微软的官方文档中,但有些问题其实官方文档并没有列出,所以在实际开发过程中如果遇到bug,就需要自身或者前人的经验去解决。比如:对于Hololens2来说,在VS中需选择ARM64而不是x86。部署需要有良好的网速;工程打包出来的文件路径和工程路径有关联,如果这两个路径不匹配,部署就会失败。部署后打不开可能是因为Unity中未添加需要部署的场景,在Build Settings中点击Add open Scenes。...

fmxs 4571

一文搞定MySQL性能调优

公众号回复关键词获取免费学习资料,加入前后端技术交流群和副业群。新建立的副业Q群:735764906。 数据库的操作越来越成为整个应用的性能瓶颈,这对于Web应用尤其明显。关于数据库的性能,这并不只是DBA需要关心的,而更是后端开发需要去关注的事情。 所以本文讲解MySQL在各个方面的优化方向,方便后端开发人员在调优和问题排查过程中找到切入点。 本文目录如下: 目录 服务器硬件的优化...

全菜工程师小辉的博客 9975

架构决策之消息中间件MQ系列六-Pulsar

一、架构

恰恰虎的博客 7253

面试之MySQL调优问题

文章目录前言一、MySQL的底层原理粗解1.1 MySQL的底层运作1.2 MySQL的存储方式二、索引(重点内容)2.1 索引是什么?2.2 MySQL调优到底是调啥的2.3 如何创建一个索引2.3.1在创建表的时候创建索引2.3.2 通过更新语句来创建索引2.4 索引的底层原理2.4.1 使用二叉树来进行模拟索引底层(淘汰)2.4.2 使用红黑树(平衡二叉树)树来进行模拟索引底层(淘汰)2.4.3 使用B树来进行模拟索引底层(淘汰)2.4.4 使用B +树来进行模拟索引底层(选用)3聚集索引与非聚集索引

雍仲的迎客茶庄 4716

SAP MD81创建客户独立需求简介

正常我们用的最多的计划独立需求都是使用的是MD61 ,今天我们说下SAP的另外的一个标准功能客户独立需求MD81。虽然SAP给这个TCODE的描述是客户独立需求,但是实际是没有地方去关联对应的客户信息的。可以看到根据客户需求产生了对应的计划订单,我们创建的时候选择的KSV是按库存生产的,所以转换的时候生产订单也按单生产的。上面填写的这些字段的信息是不是和我们销售订单里面的字段的信息很相似。1)填写交货日期,可以选择按月 ,按日,按周等类型选择对应的日期。保存后会显示对应的客户独立需求的号码,如下图。

我小时候很黑的博客 2901

基于 Arduino 的鱼缸水质检测控制系统设计

本系统通过多传感器实时采集鱼缸水质参数(pH 值、温度、溶解氧、浊度),经 Arduino 主控芯片处理后,驱动执行模块自动调节水质,并通过显示模块实时展示数据。系统具备阈值报警、自动换水、温度调节、增氧等功能,适用于家庭或小型水族箱的水质智能管理。本设计提供了低成本、易扩展的鱼缸水质管理方案,适用于家庭水族箱或小型水产养殖场景,可根据实际需求调整传感器类型和控制逻辑。注:本设计如有疑问需要解惑可直接私信本人,看我个人简介。

weixin_42300449的博客 1086

MySQL性能调优

注意事项1. 避免过度优化:优先解决性能瓶颈最严重的部分。2. 基准测试:使用sysbench或自定义脚本验证调优效果。3. 灰度发布:生产环境调整配置时逐步验证。通过以上策略,可系统性提升MySQL性能,支撑高并发、大数据量场景。实际调优需结合业务特点,持续监控与迭代。

guanxin0206的博客 4019

Python爬取谷歌学术全攻略:基于Playwright与Asyncio的高效、抗反爬虫实践

同时,文章将详细解析爬虫过程中可能遇到的各种挑战,如IP封锁、验证码、动态内容加载等,并提供切实可行的解决方案。self.logger.info(f"第 {current_page} 页解析完成,共找到 {len(page_results)} 条结果。:谷歌学术的HTML结构并非一成不变,其CSS类名和标签结构可能会发生变化,且不同地区、不同语言的界面可能存在差异,增加了数据解析的难度。self.logger.info(f"开始搜索关键词: '{keyword}',计划爬取 {max_pages} 页")

2201_76125261的博客 1550

MySQL 性能调优

优化:优化SQL语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等。这一阶段用户是可以查询到,查询服务器优化器是如何进行优化到,便于用户重构查询和修改相关配置,达到最优。前面的章节我们知道如何设计最优数据库的表结构,如何建立最好的索引,这些对于高性能来说是必不可少的。默认情况下,慢查询日志是关闭的,要使用慢查询日志功能,首先要开启慢查询日志功能。需要确认业务表结构设计是否合理,SQL语句优化是否足够,索引设计是否规范,是否可以剔除无用的索引。慢查询日志,顾名思义,就是查询花费大量时间的日志。

学习学习学习学习 1228

深入C++学习还必须掌握的一基础知识精讲

施磊C++语言基础提高课程笔记,包括了new/delete;malloc/free;引用和指针;const,指计和引用的结合;函数重载,inline的数,参数带默认值的函数;函数模板等知识点

GeniusAng的博客 1477

【Windows Server 2019】发布服务器 | 远程桌面服务的安装与配置 Ⅰ——理论,实验拓扑和安装基于RemoteAPP的RDS

博客介绍了Windows Server中远程桌面服务的理论,实验拓扑以及基于RemoteAPP的RDS安装。博文介绍了如何在Windows Server上部署发布服务器。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 6128

MySQL性能调优与深度分页优化策略

在现代的Web应用和大数据环境中,MySQL作为一款广泛使用的开源关系数据库管理系统,其性能直接影响着应用程序的响应时间和用户体验。尤其是在面对海量数据的深度分页查询时,性能问题尤为突出。本文旨在探讨MySQL的性能调优策略以及深度分页查询的优化方法。MySQL性能调优是一个复杂的过程,涉及到数据库配置、查询优化、系统资源管理等多个方面。而深度分页查询的优化则需要结合具体的应用场景和数据特性,采用灵活的策略来实现高效的数据检索。通过上述的优化措施,可以显著提升MySQL在高并发和大数据环境下的表现。

小码农的博客 3856

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MySQL 性能调优和优化技巧

如果您的查询不断备份,则更好的过程是使用。如果您的内存不足,您的服务器将缓存数据存储(如硬盘)以充当内存。在示例查询中,在末尾使用通配符有助于降低查询成本,因为要经过更少的表行。MySQL 是一种流行的开源数据库应用程序,它以一种有意义且易于访问的方式存储和构造数据。与tuning-primer 一样,它会分析您的数据库配置,寻找瓶颈和低效率。日志文件建议是列表中的第一个,但如果您滚动到底部,您可以看到提高 MySQL 性能的一般建议。如果您需要这些数据,那很好,但是包含不需要的数据会浪费性能。...

allway2的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

MYSQL中的性能调优方法

MySQL的性能调优,涉及查询优化、索引设计、服务器配置、分区表的使用等多个方面。通过合理使用这些方法,可以显著提高MySQL数据库的响应速度和处理能力。在实际应用中,调优的步骤往往需要根据业务需求、数据规模和服务器配置等因素灵活调整。

有时间就写写代码 2383

MySQL性能调优实战

MySQL性能调优是一项系统工程,涉及监控分析、参数调整、查询优化、架构设计等多个环节。在实践中,应结合具体业务场景,综合运用上述策略,持续监控、分析、调整,以达到最佳性能状态。同时,拥抱云服务和新兴技术,如云数据库、数据库代理、智能优化工具等,能够进一步提升调优效率,保障数据库系统的高性能、高可用与易管理性。

suqieer的博客 1553

通过宝塔面板实现MySQL性能简单调优

在PHP+MYSQL架构网站运行过程中,往往会遇到各种性能问题影响,如MySQL、PHP、CPU、磁盘IO、缓存等,其中MySQL瓶颈就是最常见也最难解决的一种影响网站性能的因素;通常,我们会使用redis、memcached等缓存软件来缓存内容,这确实是最优的解决方案之一,但这需要网站程序的支持,然而多数常用网站程序并不支持或者不能完美支持这些缓存软件,今天我们就来谈谈如何通过MySQL自身的配...

YNlanduiyun的博客 4358

性能调优需要考虑的三大方面

—为什么性能调优?— 说到底就俩原因:一是获得更好的系统性能;二是满足不断增加的业务需求。 通过性能调优,可以用更少的硬件资源,支撑更大量的业务发展,从而达到节省硬件投资的目的。 同时,可以在资源有限,不能扩容的情况下,提升系统的响应能力,从而为用户带来更好的使用体验。 —性能调优三大系统— 我们重点说一下在进行性能优化时,硬件、操作系统、应用程序这三大系统,需要关注的一些细节和...

qiudechao1的博客 8036

Mysql性能调优

Mysql性能调优

qq_45443475的博客 3156

MySQL索引优化与性能调优

通过慢查询日志获取到慢查询语句后,我们需要对慢查询语句进行分析。一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会会后生成一个执行计划,这个执行计划展示了具体执行的查询方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,因此我们弄清楚执行计划的各个输出项代表的含义,从而可以有针对性的提升查询性能。通过使用EXPLAIN关键字。

码农郭大大的博客 2662
上一篇: Spring Security权限控制框架详解
下一篇: MySQL 的调优(第二部分)
StackNoOverflow
博客等级 码龄1年 22粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值