MySQL性能优化

news2024/11/25 21:49:57

MySQL性能调优

MYSQL性能优化

存储数据类型优化

  1. 尽量避免使用 NULL
  2. 尽量使用可以的最小数据类型。但也要确保没有低估需要存储的范围
  3. 整型比字符串操作代价更低
  4. 使用 MySQL 内建的数据类型(比如date、time、datetime),比用字符串更快

基本数据类型

  1. 数字

  2. 整数 - TINYINT (8) - SMALLINT (16) - MEDIUMINT (24) - INT (32) - BIGINT (64)

    • 整数类型有可选的 unsigned 属性
    • int(1)与int(11),对于存储和计算来说,这两者本质是没有区别的
  3. 实数(存储小数、存储比 BIGINT 更大的数)

    • float

    • double

      float 和 double支持使用标准的浮点运算进行近似的计算。

    • decimal

      decimal 类型用于存储精确的小数,支持精确的计算。
      因为在进行精确计算时需要额外的空间和计算开销,所以尽量只对小数才使用decimal。比如,财务数据。另外如果数据量大的话,可以考虑使用bigint代替decimal,只需将存储的货币单位根据小数的位数乘以相应的倍数即可。

  4. 字符串

    • CHAR

      1、char 类型是定长的;2、适合存储很短的字符串,例如:密码的 md5 值;3、适合存储经常进行变更的值。

    • VARCHAR

      1、字符串列的长度比平均长度大很多;2、列的更新很少,所以碎片不是问题;3、使用了像 UTF-8 这样复杂的字符集,因为该字符集中每个字符可能使用不同的字节来进行存储;4、存储可变长的字符串。

  5. BLOB 和 TEXT

    两者都是为存储很大的数据而设计的字符串数据类型,不同的是两者分别采用二进制和字符方式存储。

    MySQL 在处理两个类型的值时,处理基本相同,仅有的不同是 BLOB 类型是以二进制格式来存储的,所以没有排序规则和字符集,而 text 类型有排序规则和字符集。

  6. 枚举

    枚举可以把一些不重复的字符串存储成一个预定义的集合。
    MySQL 会在存储枚举类型时粉肠紧凑,会根据列的值的数量压缩到一个或者两个字节中。
    MySQL 会在内部将每个值在列表中的位置保存成整数,而这些『数字–字符串』的对应关系,会保存在 .frm 文件中。
    所以当该列需要新添加一个新的枚举值时,必须添加在之前枚举列表的最后面,否则就会出现数据错乱的问题。切记。

  7. 日期类型

    • DATETIME

      该类型能保存大范围的值,从 1001 年到 9999 年,精度为秒。他会把时间封装到 YYYYMMDDHHIISS 的整数中,没有时区概念。使用 8 个字节的存储空间。

    • TIMESTAMP

      该类型保存了从 1970-01-01 00:00:00(格林威治时间)以来的秒数。该类型使用 4 个字节的存储空间,所以只能表示 1970 到 2023 年,其值还具有时区的概念。

  8. BIT

    存储更紧凑。但所有这些位类型,不管底层存储格式和存储方式,从技术上来说都是字符串类型。虽然用它存储数据更紧凑,但是对于大部分应用来说,最好避免使用该类型。

  9. SET

    特殊类型的数据

    某些数据的类型并不直接和内置的类型一致。所以需要一定的转换进行存储。

    低于秒级的时间戳

    低于秒级的时间需要在引用层做处理,一般可以通过存储两个或者多个列来存储(一个存储秒级的时间戳,另外的存储秒级以下的)

    ipv4 地址

    我们常见到有人会用 varchar (15) 来存错一个 IP 地址,IP 地址实际是一个 32 位的无符号整数,所以应该用无符号整数来存储 IP 地址。MySQL 提供了 INET_ATON () 和 INET_NTOA () 函数在这两表示方法之间转换。

IP地址存储

通过在应用程序中进行 字符型无符号整型 的转换,而不是使用MySQL的 INET_ATON() 函数,插入整数IP时MySQL的负载可能会稍微降低。

https://bafford.com/2009/03/09/mysql-performance-benefits-of-storing-integer-ip-addresses/

三层架构说明

  • 第一层,用于连接处理、授权认证、安全认证等等。大多数基于客户端 / 服务器端的工具或者服务器都有类似架构。
  • 第二层,是 MySQL 架构的核心部分。MySQL 的大部分核心服务功能大都在这一层。包括查询解析、分析、优化、缓存以及所有的内置函数的实现,还有所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、试图等。
  • 第三层,存储引擎层。存储引擎负责 MySQL 中数据的存储和读取。每个存储引擎都有自己的优势和劣势。MySQL 服务器层通过 API 与存储引擎进行通信。存储引擎本身是不会解析 SQL,且不同的存储引擎之间也是不会相互通信。

img

MySQL 服务器接收 / 处理一个查询请求的过程

  1. 当 MySQL 服务器接收到一个查询请求,首先会对当前的连接请求进行认证,认证其用户名和密码信息。
  2. 连接成功之后,会继续验证该连接是否具有执行某个特定查询的权限。
  3. 所有的验证都通过,如果是 select 操作,MySQL 会先检查查询缓存中是否存在该缓存,如果存在直接返回结果。不存在继续下一步。
  4. 解析查询,并创建内部数据结构(生成 解析树),然后对解析树进行各种优化(包括,重写查询,决定表的读取顺序、选择合适的索引等等)。
  5. 通过存储引擎存储或者提取结果。
  6. 如果是 select 操作,生成查询缓存。
  7. 返回结果。

根据控制的不同层次,MySQL 的并发控制可以分为:

  • 服务器层
  • 存储引擎层

实现并发控制的方法策略:锁机制

  • 共享锁(shared lock)<======> 读锁(read lock)
  • 排它锁(exclusive lock) <======> 写锁(write lock)

如何选择适合的锁?锁策略

  • 锁的粒度越小,系统的并发性越高

  • 所得操作越多,系统的开销越大

    所以所谓的锁策略,就是在锁的开销和数据的安全性之间寻求平衡。

MySQL并发控制

MySQL 中锁策略类型

MySQL 不同的存储引擎中用到的锁策略基本有两种。一种是表级锁,另一种是行级锁。

  • 表锁,一种开销最小的锁策略。

    一个用户对表进行写操作时,需要先获得写锁,这是其他用户读该表进行的读写操作都会进行阻塞。只有当前写操作被释放之后,其他人才能活的读锁。当当前表有读锁时,其他人也可以继续获得读锁。读锁是共享性的不同的读锁之间是互相不阻塞的。
    另外,写锁的优先级高于读锁。所以当有多个锁请求存在是,读锁的请求会被优先插入到锁队列的前边。

  • 行锁,最大程度支持并发处理,同时也是锁开销最大的锁策略。

    顾名思义,行级锁只在将要修改的记录行上进行锁操作,对其他的行的操作没有影响。

尽管我们一般提到的锁,都处于存储引擎这一层,但是 MySQL 本身在某些情况下,也会对锁策略进行控制。比如表的 alter table 操作,会对表本身使用表锁,而直接忽略存储引擎的锁机制。

MySQL 中死锁问题解决方法

死锁,即两个或者多个事务在同一资源上相互占用,并请求占用对方已经占用的资源的情况。

既然有锁存在,当然就会有死锁的情况发生。那么 MySQL 中是如何处理死锁问题的呢?
死锁的通常解决方案有两种,即:

  • 死锁检测机制
  • 超时机制

InnoDB 存储引擎在检测到有死锁发生的处理方法是,将当前持有最少的行级锁的事务进行回滚。待打破死锁后,重新执行因为死锁而回滚的事务。

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

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

相关文章

中国巨头在NLP领域的大模型布局

什么是大模型&#xff1f; 大规模模型&#xff08;large-scale model&#xff09;是近年来人工智能领域的一个热点话题&#xff0c;因为它们可以对自然语言处理&#xff08;NLP&#xff09;和其他任务进行更准确和深入的处理。由于大模型需要庞大的计算资源和数据支持&#xf…

论文投稿指南——中文核心期刊推荐(国家财政)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

SpringSecurity第二讲

目录 二、SpringSecurity02 2.1 JWT概述 2.1.1 JWT介绍 2.1.2 跨域认证问题 2.2 JWT的原理 2.3 JWT的数据结构 2.3.1 Header 2.3.2 Payload 2.3.3 Signature 2.4 JWT的使用方式 2.5 JWT的使用 2.5.1 引入JWT依赖 2.5.2 编写JWT工具类 2.6 编写前后端不分离的项目…

【C语言】每日刷题 —— 牛客语法篇(3)

前言 大家好&#xff0c;继续更新专栏c_牛客&#xff0c;不出意外的话每天更新十道题&#xff0c;难度也是从易到难&#xff0c;自己复习的同时也希望能帮助到大家&#xff0c;题目答案会根据我所学到的知识提供最优解。 &#x1f3e1;个人主页&#xff1a;悲伤的猪大肠9的博客…

sd卡格式化后数据恢复怎么操作

有时候我们需要清空SD卡数据文件&#xff0c;有时候则是因为需要修复SD卡所以需要格式化&#xff0c;但是却被提示无法格式化SD卡。这种情况往往是由于平时SD卡使用时的一些不良习惯或是SD卡中病毒&#xff0c;病毒在运行SD卡中的软件所造成的。那么sd卡格式化后数据恢复怎么操…

[数据结构]栈的深入学习-java实现

CSDN的各位uu们你们好,今天千泽带来了栈的深入学习,我们会简单的用代码实现一下栈, 接下来让我们一起进入栈的神奇小世界吧!0.速览文章一、栈的定义1. 栈的概念2. 栈的图解二、栈的模拟实现三.栈的经典使用场景-逆波兰表达式总结一、栈的定义 1. 栈的概念 栈&#xff1a;一种…

国密SM4分组密码算法

前言密码&#xff0c;是指使用特定变换对数据等信息进行加密保护或安全认证的物项&#xff08;承载算法、密钥、密文的介质&#xff09;和技术&#xff0c;主要用于加密和安全认证&#xff08;身份识别、完整性、抗抵赖性&#xff09;。密码按照保密等级&#xff0c;又分为核密…

06 电力电子仿真 MATLAB/Simulink

文章目录01 单相半波整流电路02 单相全波整流电路&#xff08;子系统封装模块&#xff09;03 三相桥式整流电路&#xff08;三相模块与示波器使用&#xff09;04 相控与斩控交交调压&#xff08;THD计算&#xff09;05 Buck电路&#xff08;PWM实现与闭环反馈&#xff09;06 单…

【STL】Vector剖析及模拟实现

✍作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C vector的常用接口 首先贴上&#xff1a;vector的文档介绍,以备查阅使用。 vector的基本框架&#xff1a; vector的成员变量分别是空间首部分的_start指针和最后一个元素的下一个位置的_finish指针&#xff0c;以…

Tomcat安装及启动

日升时奋斗&#xff0c;日落时自省 目录 1、Tomcat下载 2、JDK安装及配置环境 3、Tomcat配置环境 4、启动Tomcat 5、部署演示 1、Tomcat下载 直接入主题&#xff0c;下载Tomcat 首先就是别下错了&#xff0c;直接找官方如何看是不是广告&#xff0c;或者造假 搜索Tomc…

【强度混合和波段自适应细节融合:PAN-Sharpening】

Intensity mixture and band-adaptive detail fusion for pansharpening &#xff08;用于全色锐化的强度混合和波段自适应细节融合&#xff09; 全色锐化的目的是通过高分辨率单通道全色&#xff08;PAN&#xff09;图像锐化低分辨率多光谱&#xff08;MS&#xff09;图像&a…

ChatGPT、人工智能、人类和一些酒桌闲聊

© 2023 Conmajia Initiated 10th March, 2023 昨天跟某化学家喝酒&#xff0c;期间提到了 ChatGPT。他的评价是&#xff1a;这鬼东西大量输出毫无意义、错漏百出甚至是虚假的信息&#xff0c;“in a confident accent”。例如某次 GPT 针对“描述某某记者”这一问题&#…

C++的入门

C的关键字 C总计63个关键字&#xff0c;C语言32个关键字 命名空间 我们C的就是建立在C语言之上&#xff0c;但是是高于C语言的&#xff0c;将C语言的不足都弥补上了&#xff0c;而命名空间就是为了弥补C语言的不足。 看一下这个例子。在C语言中会报错 #include<stdio.h>…

【C++】C++11——左右值|右值引用|移动语义|完美转发

文章目录一、左值与右值1.概念2.引用3.注意二、右值引用的意义1.左值引用意义2.右值引用和移动语义3.容器新增三、万能引用四、完美转发一、左值与右值 1.概念 左值是什么&#xff1f;右值是什么&#xff1f; 左值是一个表示数据的表达式&#xff08;如变量名或解引用的指针&…

学校学生心理测评系统

青少年在线心理测评系统 这款系统&#xff0c;是和北大合作开发&#xff0c;并真实用于线上测评场景&#xff0c;该项目有完整后台&#xff0c;以及学生管理等模块。 我们欢迎以下形式合作&#xff1a; 单纯研究项目。合作对该测评平台进行升级。单纯使用。 请联系我们 silv…

MyBatis里面用了多少种设计模式?

在MyBatis的两万多行的框架源码中&#xff0c;使用了大量的设计模式对工程架构中的复杂场景进行解耦&#xff0c;这些设计模式的巧妙使用是整个框架的精华。经过整理&#xff0c;大概有以下设计模式&#xff0c;如图1所示。图101类型&#xff1a;创建型模式▊ 工厂模式SqlSessi…

英飞凌Tricore原理及应用介绍04_中断请求及仲裁过程

目录1.概述2. 中断请求及过程仲裁3. 中断传到CPU会被即时响应吗&#xff1f;1.概述 在Tricore架构中允许有多个中断源包括片上外设及外部中断世间产生的中断请求&#xff0c;以打断中断服务的提供者如CPU或DMA通道&#xff0c;那你知道在Tricore里中断请求在内核中的仲裁及处理…

【java基础】ArrayList源码解析

文章目录基本介绍构造器指定初始容量默认创建通过集合创建添加add扩容机制批量添加addAll添加指定位置add添加多个元素到指定位置addAll删除删除指定元素remove删除指定索引元素remove条件删除removeIf批量删除removeAll修改修改指定位置set替换所有满足要求元素replaceAll一些…

vscode环境配置(支持跳转,阅读linux kernel)

目录 1.卸载clangd插件 2.安装C插件 3. 搜索框内输入 “intell”&#xff0c;将 C_Cpp&#xff1a;Intelli Sense Engine 开关设置为 Default。 4.ubuntu安装global工具 5.vscode安装插件 6.验证是否生效 7.建立索引 1.卸载clangd插件 在插件管理中卸载clangd插件 2.安…

课设-机器学习课设-实现新闻分类

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;课设-机器学习 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;…