mysql笔记:11. 性能优化

文章目录

  • 概览
  • 查询速度优化
    • 1. 分析查询语句
      • 1.1 EXPLAIN
      • 1.2 DESCRIBE
    • 2. 使用索引优化查询
    • 3. 优化子查询
  • 数据库结构优化
    • 1. 分解表
    • 2. 建立中间表
    • 3. 增加冗余字段
    • 4. 优化插入速度
      • 4.1. MyISAM引擎表
      • 4.2. InnoDB引擎表
    • 5. 分析表、检查表和优化表
      • 5.1. 分析表
      • 5.2. 检查表
      • 5.3. 优化表
  • MySQL服务器的优化
    • 1. 服务器硬件优化
    • 2. MySQL参数优化

性能优化是通过合理安排资源,调整系统参数使MySQL运行更快、更节省资源。主要包括查询速度优化、更新速度优化、MySQL服务器优化等。

概览

MySQL数据库优化是多方面的,原则上是减少系统的瓶颈和资源的占用、增加系统的反应速度。
MySQL常用的性能参数值如下表:

参数名功能
connections连接服务器的次数
uptime服务器的上线时间
slow_queries慢查询的次数
com_select查询操作的次数
com_insert插入操作的次数
com_update更新操作的次数
com_delete删除操作的次数

查询命令语法:

mysql> show status like 'NAME';

查询速度优化

在数据库中,一般对数据的查询操作是最频繁的,提高数据的查询速度可以有效提升数据库的性能。

1. 分析查询语句

通过分析查询语句,可以了解查询语句的执行情况,找出查询语句的不足之处,从而优化查询语句。
分析查询语句有两种方式:EXPLAIN和DESCRIBE。

1.1 EXPLAIN

基本语法:

EXPLAIN [EXTENDED] SELECT select_options

参数select_type:SELECT类型,可以为以下任何一种:

含义
SIMPLE简单SELECT(不使用UNION或子查询)
PRIMARY最外面的SELECT
UNIONUNION中的第二个或后面的SELECT语句
DEPENDENT UNIONUNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULTUNION的结果。
SUBQUERY子查询中的第一个SELECT
DEPENDENT SUBQUERY子查询中的第一个SELECT,取决于外面的查询
DERIVED导出表的SELECT(FROM子句的子查询)

1.2 DESCRIBE

基本语法:

DESCRIBE SELECT select_options

2. 使用索引优化查询

索引可以快速定位表中的某条记录,使用索引可以提高数据库的查询速度,从而提高数据库的性能。如果不使用索引,查询语句将扫描表中全部记录,速度会很慢;使用索引,查询语句可以根据索引快速定位到待查询记录,从而减少查询的记录数,达到提高查询速度的目的。
一般情况下,索引可以提高查询速度,但并不是所有使用带有索引的字段查询都会起作用。例如下面几种特殊情况:

  • 使用LIKE关键字的查询语句
  • 使用多列索引的查询语句
  • 使用OR关键字的查询语句

3. 优化子查询

子查询可以进行SELECT语句的嵌套查询,即一个SELECT查询的结果作为另一个的条件。它可以一次性完成很多逻辑上需要多个步骤才能完成的SQL操作。
其优点是查询语句很灵活,但是其执行效率不高。
执行子查询时,MySQL需要为内层查询语句的查询结果建立一个临时表,然后外层查询语句从临时表中查询记录。查询完毕后,再撤销这些临时表。因此,子查询的速度会受到一定的影响。如果查询的数据量比较大,这种影响也随之增大。
在MySQL中,可以使用连接(JOIN)查询来替代子查询。它不需要建立临时表,速度比子查询要快。如果查询中使用索引的话,性能会更好。

数据库结构优化

合理的数据库结构不仅可以使数据库占用更小的磁盘空间,而且能够使查询速度更快。设计时,需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面内容。

1. 分解表

对于字段较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新的表。因为当一个表的数据量很大时,会由于使用频率低的字段而变慢。

2. 建立中间表

对于需要经常联合查询的表,可以建立中间表提高查询效率。

3. 增加冗余字段

设计数据库表时应该尽量遵循数据库范式理论的规约,尽可能减少冗余字段,让数据库看起来更加精致。但是,合理地加入冗余字段可以提高查询速度。
表的规范化程度越高,表与表之间的关系就越多,需要连接查询的情况也就越多。
不过冗余字段会导致一些新问题。如,一个表中的冗余字段值修改了,就要同步更新其他表中的该字段值,否则就会使原本一致的数据变得不一致。

4. 优化插入速度

插入记录时,影响插入速度的主要是索引、唯一性校验、一次插入记录条数等。

4.1. MyISAM引擎表

  • 禁用索引
    对于非空表,插入记录时,MySQL会根据表的索引对插入的记录建立索引。如果插入大量数据,建立索引会降低插入记录的速度。可以在插入记录前禁用索引,数据插入完毕后再开启索引。
# 禁用索引
ALTER TABLE table_name DISABLE KEYS;# 启用索引
ALTER TABLE table_name ENABLE KEYS;

空表批量导入数据时不需要进行此操作,因为MyISAM引擎的表是在导入数据之后才建立索引的。

  • 禁用唯一性检查
    插入数据时,MySQL会对插入的记录进行唯一性校验。这种校验也会降低插入速度。可以先禁用,插入数据后再开启。
# 禁用唯一性校验
SET UNIQUE_CHECKS=0;# 启用唯一性校验
SET UNIQUE_CHECKS=1;
  • 使用批量插入

  • 使用LOAD DATA INFILE批量导入

4.2. InnoDB引擎表

  • 禁用唯一性检查
    和MyISAM引擎的使用一样。
  • 禁用外键检查
# 禁用外键检查
SET foreign_key_checks=0;# 启用外键检查
SET foreign_key_checks=1;
  • 禁止自动提交
# 禁用自动提交
SET autocommit=0;# 启用自动提交
SET autocommit=1;

5. 分析表、检查表和优化表

MySQL提供了分析表、检查表和优化表的语句。

5.1. 分析表

分析表主要是分析关键字的分布,语法:

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE table_name1 [, table_name2, ...]

5.2. 检查表

MySQL数据库中可以使用CHECK TABLE检查表,主要是检查InnoDB和MyISAM类型的表是否存在错误,语法:

CHECK TABLE table_name1 [, table_name2, ...] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}

5.3. 优化表

优化表主要是消除删除或者更新造成的空间浪费。该语句对InnoDB和MyISAM类型的表都有效。主要是优化表中的VARCHAR、BLOB或TEXT类型的字段。语法:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE table_name1 [, table_name2, ...]

MySQL服务器的优化

1. 服务器硬件优化

服务器的硬件性能直接决定着MySQL数据库的性能。优化方向:

  • 配置较大的内存
  • 配置调整磁盘系统
  • 合理分布磁盘I/O
  • 配置多处理器

2. MySQL参数优化

通过优化MySQL参数也可以在不提升硬件的前提下提高资源利用率,从而达到提高服务器性能的目的。配置参数都在my.cnf或者my.ini文件中。

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

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

相关文章

php使用ElasticSearch

ElasticSearch简介 Elasticsearch 是一个分布式的、开源的搜索分析引擎,支持各种数据类型,包括文本、数字、地理、结构化、非结构化。 Lucene与ElasticSearch Apache Lucene是一款高性能的、可扩展的信息检索(IR)工具库&#xf…

苹果AR设备未来展望:硬件舒适性、软件功能与网络速度等多维度期待

苹果增强现实(AR)设备(可能是指Apple Vision Pro)的期待和改进建议,以及关于硬件、软件、网络速度和WIFI技术的未来展望。以下是对这些观点的综合分析: 硬件与舒适性改进: 更轻更舒适的材料以及更贴合眼眶的设计能够提升用户的佩戴体验,减少长时间使用带来的不适。自动…

嵌入式软件开发面试重点项

最近准备面试了,梳理一些面试经常考试的细节点,不然每次都要去整理,答案未给出。 一、C语言基础 1.1、字节对齐 link Struct和Union字节对齐的内存占用计算方法 link 怎么计算union和struct中字节数计算 1.2、union数据空间大小计算 link 怎么计算u…

灯塔:CSS笔记(2)

一 选择器进阶 后代选择器:空格 作用:根据HTML标签的嵌套关系,,选择父元素 后代中满足条件的元素 选择器语法:选择器1 选择器2{ css } 结果: *在选择器1所找到标签的后代(儿子 孙子 重孙子…

基于SSM的党务政务服务热线平台(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的党务政务服务热线平台(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spri…

503. 下一个更大元素 II

503. 下一个更大元素 II 题目链接&#xff1a;503. 下一个更大元素 II 代码如下&#xff1a; class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> res(nums.size(),-1);stack<int> sta;//单调栈sta.push…

mac本地启动sentinel

启动Sentinel控制台 1&#xff09;下载sentinel控制台jar包 https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar 2&#xff09;启动sentinel控制台 使用如下命令启动控制台&#xff1a; java -Dserver.port8080 -Dcsp.sentinel.d…

python淘宝网页爬虫数据保存到 csv和mysql(selenium)

数据库连接设置&#xff08;表和字段要提前在数据库中建好&#xff09; # 数据库中要插入的表 MYSQL_TABLE goods# MySQL 数据库连接配置,根据自己的本地数据库修改 db_config {host: localhost,port: 3306,user: root,password: ma*****6,database: may2024,charset: utf8mb…

第七节 JDBC Statements, PreparedStatement和CallableStatement语句

当获得了与数据库的连接后&#xff0c;就可以与数据库进行交互了。 JDBC Statement&#xff0c;CallableStatement和PreparedStatement接口定义了可用于发送SQL或PL/SQL命令&#xff0c;并从数据库接收数据的方法和属性。 它们还定义了有助于在Java和SQL数据类型的数据类型差异…

SSRF漏洞原理及其修复方式和加固方式

SSRF&#xff08;Server Side Request Forgery&#xff09;服务器端请求伪造漏洞是一种安全漏洞&#xff0c;攻击者利用该漏洞可以发起任意的网络请求&#xff0c;并可能访问内部系统资源。 SSRF漏洞的原理是&#xff0c;服务器端应用程序未对从用户输入中获取的URL进行充分验…

Flink 物理执行图

文章目录 物理执行图一、Task二、ResultPartition三、ResultSubpartition四、InputGate五、InputChannel 物理执行图 JobManager根据ExecutionGraph对作业进行调度&#xff0c;并在各个TaskManager上部署任务。这些任务在TaskManager上的实际执行过程就形成了物理执行图。物理…

Linux环境下使用线程方式操作UART读写功能

目录 概述 1 Linux环境下UART设备 2 轮询方式操作UART功能实现 2.1 打开串口函数&#xff1a;usr_serial_open 2.2 关闭串口函数&#xff1a; usr_serial_close 2.3 发送数据函数&#xff1a; usr_serial_sendbytes 2.4 接收数据函数&#xff1a; thread_uart_readbytes …

问题解决 | vscode无法连接服务器而ssh和sftp可以

解决步骤 进入家目录删除.vscode-server rm -rf .vscode-server 然后再次用vscode连接服务器时&#xff0c;会重新安装&#xff0c;这时可能报出一些缺少依赖的错 需要联系管理员安装相关依赖&#xff0c;比如 sudo apt-get install libstdc6 至此问题解决

Go语言框架路由Controller控制器设计思路gin路由根据控制器目录分层生成路由地址

Controller设计好处 框架设计用controller分请求路由层级&#xff0c;应用从app目录开始对应请求url路由地址&#xff0c;这样设计师方便开发时候通过请求地址层级快速定位接口方法对应的代码位置。 例如api接口请求路径为&#xff1a;​​http://localhost:8110/​​busines…

部署 LVS(nginx)+keepalived高可用负载均衡集群

目录 一、集群的概述 1、什么是集群 2、普通集群与负载均衡集群 2.1 普通集群&#xff08;Regular Cluster&#xff09; 2.2 负载均衡集群&#xff08;Load Balancing Cluster&#xff09; 2.3 高可用集群&#xff08;High Availability Cluster&#xff09; 2.4 区别 …

【LeetCode 算法专题突破】---二分查找(⭐⭐⭐)

前言 我在算法题目的海洋中畅游已久&#xff0c;也曾在算法竞赛中荣获佳绩。然而&#xff0c;我发现自己对于算法的学习&#xff0c;还缺乏一个系统性的总结和归类。尽管我已经涉猎过不少算法类型&#xff0c;但心中仍旧觉得有所欠缺&#xff0c;未能形成完整的算法体系。 因…

服务器又被挖矿记录

写在前面 23年11月的时候我写过一篇记录服务器被挖矿的情况&#xff0c;点我查看。当时是在桌面看到了bash进程CPU占用异常发现了服务器被挖矿。 而过了几个月没想到又被攻击&#xff0c;这次比上次攻击手段要更高明点&#xff0c;在这记录下吧。 发现过程 服务器用的是4090…

贪心算法(greedy algorithm,又称贪婪算法)详解(附例题)

目录 基本思想一&#xff09;概念二&#xff09;找出全局最优解的要求三&#xff09;求解时应考虑的问题四&#xff09;基本步骤五&#xff09;贪心策略选择六&#xff09;实际应用 1.零钱找回问题2.背包问题3.哈夫曼编码4.单源路径中的Djikstra算法5.最小生成树Prim算法 基本…

TCP包头

TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接 SYN SYNACK ACK SYN是TCP包头的一个字段 tcp.port 端口号 抓包数据 2.在通信过程中通过序…

使用Apache Kafka的Golang实践指南

您是否在寻找构建可扩展、高性能应用程序的方法&#xff0c;这些应用程序可以实时处理流数据&#xff1f;如果是的话&#xff0c;结合使用Apache Kafka和Golang是一个很好的选择。Golang的轻量级线程非常适合编写类似Kafka生产者和消费者的并发网络应用程序。它的内置并发原语&…