《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)
文章目录
- 3.1 查询优化技巧
- 3.1.1 基础知识
- 3.1.2 重点案例
- 3.1.3 拓展案例
- 3.2 索引和查询性能
- 3.2.1 基础知识
- 3.2.2 重点案例
- 3.2.3 拓展案例
- 3.3 优化数据库结构和存储引擎
- 3.3.1 基础知识
- 3.3.2 重点案例
- 3.3.3 拓展案例
3.1 查询优化技巧
让我们来聊聊如何让你的 MySQL 查询跑得像被闪电击中一样快。查询优化是艺术与科学的完美结合,它涉及到理解如何有效利用 MySQL 的特性来减少执行时间和资源消耗。掌握这些技巧,你就能让你的数据库查询不仅快速而且高效。
3.1.1 基础知识
- 避免 SELECT *:指定需要的列,而不是使用
SELECT *
,这样可以减少网络传输的数据量和减少数据库的负担。 - 使用索引:为常用查询的列创建索引,特别是 WHERE 子句中的列,可以显著提高查询速度。
- 合理使用 JOIN:确保 JOIN 操作的表都有索引,在可能的情况下使用 INNER JOIN 替代 OUTER JOIN,因为 OUTER JOIN 通常更耗时。
- 优化子查询:尽可能将子查询重写为 JOIN 操作,因为 MySQL 对于 JOIN 的优化通常比子查询更好。
- 使用 LIMIT 分页:当只需要部分结果集时,使用 LIMIT 来减少处理的数据量。
- 避免在 WHERE 子句中使用函数或表达式:这样做会使索引失效,因为 MySQL 必须对每行数据执行函数或计算表达式。
3.1.2 重点案例
用户数据分析查询优化:假设你正在为一个大型电子商务网站工作,需要分析特定时间段内用户的购买行为。初始查询可能是这样的:
SELECT * FROM orders WHERE order_date BETWEEN '2021-01-01' AND '2021-01-31';
优化后的查询应该指定需要的列,并确保 order_date
列有索引:
SELECT order_id, user_id, total_price FROM orders WHERE order_date BETWEEN '2021-01-01' AND '2021-01-31';
3.1.3 拓展案例
-
优化报告生成查询:为了生成月度销售报告,你需要聚合过去一个月的订单数据。初始查询可能使用了 GROUP BY 来汇总每天的销售额。通过在
order_date
和total_price
上创建复合索引,可以加速这个聚合查询的执行速度。 -
社交媒体应用的消息查询优化:在一个社交媒体应用中,显示用户的最新消息是一个常见需求。如果初始查询使用了 ORDER BY 来排序所有消息,那么通过为
user_id
和message_date
创建复合索引,并使用 LIMIT 来限制结果数量,可以显著减少查询时间。
通过这些案例,我们可以看到,查询优化需要对数据库的工作方式有深入的理解,以及对查询执行计划的分析。通过简单的调整和优化策略,我们可以大大提高查询性能,减少等待时间,提升用户体验。始终记住,最好的查询优化策略是基于实际的测试和分析,而不是盲目地遵循“最佳实践”。
3.2 索引和查询性能
在数据库世界里,索引是那个能让查询性能飙升的神奇配方。但就像任何强大的工具一样,如果使用不当,它也可能带来副作用。理解索引如何工作以及如何正确地使用它们,对于优化查询性能至关重要。
3.2.1 基础知识
- 索引类型:了解不同的索引类型及其使用场景是优化查询性能的第一步。B-Tree 索引适用于大多数情况,特别是等值查询和范围查询。FULLTEXT 索引优化了文本搜索。HASH 索引快速查找等值查询,但不支持范围查询。
- 索引列的选择:索引并非越多越好。选择适合索引的列基于这些列是否频繁出现在 WHERE 子句、JOIN 条件、ORDER BY 和 GROUP BY 子句中。
- 索引维护:索引需要维护。随着数据的增加,索引可能会碎片化,定期重建索引可以恢复查询性能。
- 读写平衡:索引提高了读操作的速度,但每次插入或更新操作都需要更新索引,这会降低写操作的性能。因此,索引策略需要在读取性能和写入性能之间找到平衡。
3.2.2 重点案例
电商网站的商品搜索:一个电商网站需要对其庞大的商品数据库进行快速搜索。商品表 Products
包括 ProductID
、ProductName
、CategoryID
、Price
等字段。
- 为
ProductName
和CategoryID
创建 B-Tree 索引:因为用户经常根据产品名称和类别进行搜索,这两个字段的索引可以显著提高搜索效率。 - 复合索引:如果发现大多数查询都在同时使用
CategoryID
和Price
来过滤结果,那么创建一个复合索引(CategoryID, Price)
会更有效,因为它可以在单一索引查找中解决查询需求。
3.2.3 拓展案例
-
博客平台的文章检索:在一个内容管理系统中,用户需要根据文章的标题、发布日期或作者进行搜索。假设文章表
Articles
包括ArticleID
、Title
、AuthorID
、PublishDate
和Content
。- 为
Title
和PublishDate
创建索引:这支持了基于标题的搜索和日期范围查询,特别是当用户查找最新发布的文章时。 - FULLTEXT 索引:对
Content
字段使用 FULLTEXT 索引,优化基于内容的搜索查询,使得搜索文章内容变得快速高效。
- 为
-
客户关系管理(CRM)系统中的数据查询:CRM 系统需要快速访问客户信息、销售记录和联系历史。客户表
Customers
包括CustomerID
、Name
、Email
、Phone
和Region
。- 为
Email
和Region
创建索引:这两个字段经常用于查询,索引可以加速这些操作。 - 考虑使用前缀索引:如果
Name
字段很长,而查询通常只基于名字的前几个字符,可以考虑对Name
字段的前缀使用索引,这样可以减少索引大小,同时保持查询性能。
- 为
通过这些案例,我们看到索引是提高数据库查询性能的强大工具,但关键在于如何精心设计索引策略。选择正确的索引类型,合理地决定哪些列需要索引,以及如何维护索引,都是确保数据库性能最优化的重要因素。记住,每次添加索引时都要考虑其对读写性能的影响,以及随之增加的维护成本。通过持续监控和调整,你可以确保数据库在满足业务需求的同时运行得既快速又高效。
3.3 优化数据库结构和存储引擎
在追求数据库性能的旅程中,优化数据库结构和选择合适的存储引擎是关键步骤。这不仅关乎于如何存储数据,更关乎于如何高效地访问和管理这些数据。正确的结构和存储引擎能够提升性能,降低延迟,优化资源使用,让数据库运行得更加顺畅。
3.3.1 基础知识
- 数据库结构优化:包括合理设计表结构、选择适当的数据类型、使用规范化来避免数据冗余和保证数据完整性。在某些情况下,适度的反规范化可以提高查询性能,尤其是在读操作远多于写操作的场景中。
- 存储引擎选择:MySQL 提供了多种存储引擎,其中最常用的是 InnoDB 和 MyISAM。InnoDB 支持事务处理、行级锁定和外键约束,适合于需要高可靠性和事务性的应用。MyISAM 则在读密集型的场景下表现更佳,但不支持事务和行级锁。
- 索引优化:基于表的使用方式选择合适的索引类型,如 B-Tree 索引或 FULLTEXT 索引,并定期检查和维护索引以避免碎片化。
3.3.2 重点案例
在线教育平台:假设你正在管理一个在线教育平台的数据库,该平台包含大量的课程内容、学生信息和课程订阅信息。
- 数据库结构优化:为了提高数据检索效率,课程信息和学生信息被存储在独立的表中,通过课程订阅表来关联。选择适当的数据类型,例如,使用 INT 类型的 ID 作为主键,VARCHAR 类型存储课程名称和学生姓名,以及使用 DATE 类型存储订阅日期。
- 选择存储引擎:由于系统中涉及到大量的事务处理,如学生订阅和取消课程,因此选择 InnoDB 存储引擎以支持事务和行级锁定,确保数据的一致性和完整性。
3.3.3 拓展案例
-
电子商务网站的订单处理系统:电子商务网站需要处理大量的订单和支付事务,这要求数据库不仅要高效地处理并发写操作,还要支持复杂的事务。
- 结构优化:订单信息、客户信息和支付信息分别存储在独立的表中,通过外键关联,以便高效地执行联表查询和更新操作。
- 存储引擎:选择 InnoDB 存储引擎,因为它提供了必要的事务支持和行级锁定功能,保证了处理高并发事务的能力。
-
博客系统的文章和评论管理:一个博客系统需要快速地展示文章和相关评论,同时还要支持搜索功能。
- 结构优化:文章和评论分别存储在两个表中,文章表中包含文章内容和元数据,评论表存储用户评论,通过文章 ID 关联。
- 存储引擎和索引:使用 InnoDB 存储引擎支持评论的频繁更新,对文章的标题和内容使用 FULLTEXT 索引优化搜索查询。
通过这些案例,我们看到优化数据库结构和合理选择存储引擎对于提升数据库性能有着至关重要的作用。结构优化可以提高数据访问的效率,减少不必要的数据冗余,而正确的存储引擎选择则确保了数据操作的性能和一致性。在设计和优化数据库时,应根据应用的具体需求和数据访问模式来做出决策,以实现最佳的性能和可扩展性。
相关文章:

《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)
文章目录 3.1 查询优化技巧3.1.1 基础知识3.1.2 重点案例3.1.3 拓展案例 3.2 索引和查询性能3.2.1 基础知识3.2.2 重点案例3.2.3 拓展案例 3.3 优化数据库结构和存储引擎3.3.1 基础知识3.3.2 重点案例3.3.3 拓展案例 3.1 查询优化技巧 让我们来聊聊如何让你的 MySQL 查询跑得像…...

【golang】23、gorilla websocket 源码:examples、数据结构、流程
文章目录 一、examples1.1 echo1.1.1 server.go1.1.2 client.go 1.2 command1.2.1 功能和启动方式1.2.2 home.html1.2.3 main.go 1.3 filewatch1.3.1 html1.3.2 serveHome 渲染模板1.3.3 serveWs1.3.4 writer() 1.4 buffer pool1.4.1 server1.4.2 client 1.5 chat1.5.1 server1…...

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式 基础(持续更新~)
具体操作: day2: 作用: 出现跨域问题 配相对应进行配置即可解决: IDEA连接的,在url最后加参数?useSSLfalse注意链接密码是123(docker中mysql密码) 注意,虚拟机中设置的密码和ip要和主机上…...

flask+pyinstaller实现mock接口,并打包到exe运行使用postman验证
flask代码 from flask import Flask, request, jsonifyapp Flask(__name__)app.route("/login", methods[POST]) def login():username request.json.get("username").strip() # 用户名password request.json.get("password").strip() # 密…...

【Spring Boot】第一篇 创建简单的Spring Boot项目
导航 一. 简介二. 创建简单的Spring Boot项目1. 工具选择和版本确定2. 创建步骤 三. 部署项目四. 测试验证 一. 简介 Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的创建和配置过程,同时提供了很多开箱即用的功能&am…...

SSL协议是什么?关于SSL和TLS的常见问题解答
SSL(安全套接字层)及其后继者TLS(传输层安全)是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用,但我们仍将这些相关技术称为“SSL”或“SSL/TLS”。那么…...
第十五个知识:JQuery
初识JQuery: <head><meta charset"UTF-8"><title>Title</title><script src"lib/jquery-3.7.1.js"></script>//引入jquery </head> <body><a href"https://www.baidu.com" id"baidu&q…...
用Matlab 2015a svmtrain函数训练的SVM model在2021b无法使用的解决方法
背景 与r2015a版本的Matlab相比,r2021b版本中包含更多集成好的算法模块(尤其是深度学习的模块),想把原来r2015a版本的代码升级到r2021b高版本的Matlab已经采用fitcsvm函数和predict函数替代了旧版本中svmtrain函数和svmclassify函…...
umount:/home/tuners/windows files:目标忙。
您提到的错误信息 "umount: /home/tuners/windows files: 目标忙。" 是在尝试卸载(umount)一个文件系统时常见的错误。这个错误表明有一些进程仍然在使用挂载点(/home/tuners/windows files)下的文件或目录,…...

FPGA_vga显示
一 VGA 1.1 VGA VGA是视频图像阵列,是一种使用模拟信号进行视频传输的标准协议。 1.2 VGA接引脚定义 VGA分公母两种,RGB显示标准。 1.3 VGA显示器 VGA显示器采用图像扫描的方式进行图像显示,将构成图像的像素点,在行同步信号…...
sklearn模型指标和特征贡献度查看
文章目录 算法介绍r2_scoretrain_test_splitDecisionTreeRegressor参考文献支持快速查看traget和特征之间的关系 # -*- coding: utf-8 -*- import pandas as pd pd.set_option(display.max_columns, None) pd.set_option...

2024.2.6日总结(小程序开发3)
页面配置 页面配置和全局配置的关系: 小程序中,app.json中的window节点,可以全局配置小程序中每个页面的窗口表现 如果某些小程序想要有特殊的窗口表现,可以用页面级别的.json配置文件实现这个需求 页面配置和全局配置冲突时&…...

相机图像质量研究(10)常见问题总结:光学结构对成像的影响--光圈
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...
TCP和UDP相关问题(重点)(3)——3.HTTP基于TCP还是UDP?
HTTP/3.0 之前是基于 TCP 协议的,而 HTTP/3.0 将弃用 TCP,改用 基于 UDP 的 QUIC 协议 。具体见HTTP相关问题-CSDN博客...

基于modbus rtu协议操作PLC的EPICS示例
硬件设备 本实验中使用到的设备如下: 1、S7-200 Smart SR20 PLC 作为受控设备,执行机构。 S7-200 Smart是西门子的一款小型PLC产品(以下简称Smart系列)。 Smart系列PLC是西门子公司经过大量调研,为中国小型自动化…...

网站被攻击有什么办法呢?
最近,德迅云安全遇到不少网站用户遇到攻击问题,来咨询安全解决方案。目前在所有的网络攻击方式中,DDoS是最常见,也是最高频的攻击方式之一。不少用户网站上线后,经常会遭受到攻击的困扰。有些攻击持续时间比较短影响较…...
VoIP之主备注册服务器机制
在IP话机的实际使用中,不可避免的会出现服务器离线运维、服务宕机、IP话机和服务器连接中断等情况。为了保证电话服务的连续性,在VoIP部署服环境中必须有冗余机制。常见的冗余机制以主备服务器的形式实现。 一、主备机制原理 话机正常情况下注册在主服…...

【数据分享】1929-2023年全球站点的逐年平均降水量(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,说到常用的降水数据,最详细的降水数据是具体到气象监测站点的降水数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全…...

uniapp /微信小程序 使用map组件实现手绘地图方案
获取地图范围 点图拾取坐标-地图开放平台|腾讯位置服务 获取需要手绘地图左下角和右上角GPS坐标 以北京故宫为例: 截取需要手绘地图进行手绘地图制作 素材处理 由于地图素材文件比较大,小程序又限制包大小<2M,无…...

react+antd+CheckableTag实现Tag标签单选或多选功能
1、效果如下图 实现tag标签单选或多选功能 2、环境准备 1、react18 2、antd 4 3、功能实现 原理: 封装一个受控组件,接受父组件的参数,数据发现变化后,回传给父组件 1、首先,引入CheckableTag组件和useEffect, useMemo, use…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...