当前位置: 首页 > news >正文

MySQL性能优化

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

相关文章:

MySQL性能优化

MySQL性能调优 存储数据类型优化 尽量避免使用 NULL尽量使用可以的最小数据类型。但也要确保没有低估需要存储的范围整型比字符串操作代价更低使用 MySQL 内建的数据类型&#xff08;比如date、time、datetime&#xff09;&#xff0c;比用字符串更快 基本数据类型 数字 整数…...

C语言/动态通讯录

本文使用了malloc、realloc、calloc等和内存开辟有关的函数。 文章目录 前言 二、头文件 三、主界面 四、通讯录功能函数 1.全代码 2.增加联系人 3.删除联系人 4.查找联系人 5.修改联系人 6.展示联系人 7.清空联系人 8.退出通讯录 总结 前言 为了使用通讯录时&#xff0c;可以…...

我用Compose做了一个地图轮子OmniMap

一、前言 半年前&#xff0c;我发布过一篇介绍&#xff1a;Compose里面如何使用地图&#xff0c;比如高德地图 的文章&#xff0c;原本是没有想造什么轮子的✍️ 闲来无事&#xff0c;有一天看到了评论区留言让我把源码地址分享出来&#xff0c;我感觉我太懒了&#xff0c;后来…...

STM32之SPI

SPISPI介绍SPI是串行外设接口(Serial Peripherallnterface)的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为PCB的布局上节省空间&#xff0c;提供方便…...

02 深度学习环境搭建

1、查看对应版本关系 详细见&#xff1a;https://blog.csdn.net/qq_41946216/article/details/129476095?spm1001.2014.3001.5501此案例环境使用 CUDA 11.7、Pytouch1.12.1、Miniconda3_py38(含Python3.8) 2. 安装Anaconda 或 Miniconda 本案例重点一为Miniconda准 2.1 安…...

PHP导入大量CSV数据的方法分享

/** * @description 迭代器读取csv文件 * @param $strCsvPath * @return \Generator */ public static function readPathCsvFile($strCsvPath) { if ($handle = fopen($strCsvPath, r)) { while (!feof($handle)) { yield fgetcsv($handle); } …...

代码看不懂?ChatGPT 帮你解释,详细到爆!

偷个懒&#xff0c;用ChatGPT 帮我写段生物信息代码如果 ChatGPT 给出的的代码不太完善&#xff0c;如何请他一步步改好&#xff1f;网上看到一段代码&#xff0c;不知道是什么含义&#xff1f;输入 ChatGPT 帮我们解释下。生信宝典 1: 下面是一段 Linux 代码&#xff0c;请帮…...

【MyBatis】篇三.自定义映射resultMap和动态SQL

MyBatis整理 篇一.MyBatis环境搭建与增删改查 篇二.MyBatis查询与特殊SQL 篇三.自定义映射resultMap和动态SQL 篇四.MyBatis缓存和逆向工程 文章目录1、自定义映射P1:测试数据准备P2:字段和属性的映射关系P3:多对一的映射关系P4:一对多的映射关系2、动态SQL2.1 IF标签2.2 w…...

什么是API?(详细解说)

编程资料时经常会看到API这个名词&#xff0c;网上各种高大上的解释估计放倒了一批初学者。初学者看到下面这一段话可能就有点头痛了。 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开…...

比cat更好用的命令!

大家好&#xff0c;我是良许。 作为程序员&#xff0c;大家一定对 cat 这个命令不陌生。它主要的功能就是用来显示文本文件的具体内容。 但 cat 命令两个很重大的缺陷&#xff1a;1. 不能语法高亮输出&#xff1b;2. 文本太长的话无法翻页输出。正是这两个不足&#xff0c;使…...

MySQL、HBase、ElasticSearch三者对比

1、概念介绍 MySQL&#xff1a;关系型数据库&#xff0c;主要面向OLTP&#xff0c;支持事务&#xff0c;支持二级索引&#xff0c;支持sql&#xff0c;支持主从、Group Replication架构模型&#xff08;本文全部以Innodb为例&#xff0c;不涉及别的存储引擎&#xff09;。 HBas…...

Vue+ElementUI+Vuex购物车

最完整最能理解的Vuex版本的购物车购物车是最经典的小案例。Vuex代码&#xff1a;import Vue from vue import Vuex from vuex import $http from ../request/http Vue.use(Vuex)const store new Vuex.Store({state:{shopList:[],},mutations:{setShopCarList(state,payload)…...

Android 录屏 实现

https://lixiaogang03.github.io/2021/11/02/Android-%E5%BD%95%E5%B1%8F/ https://xie.infoq.cn/article/dd40cd5d753c896225063f696 视频地址&#xff1a; https://time.geekbang.org/dailylesson/detail/100056832 概述 在视频会议、线上课堂、游戏直播等场景下&#x…...

【CSAPP】家庭作业2.55~2.76

文章目录2.55*2.56*2.57*2.58**2.59**2.60**位级整数编码规则2.61**2.62***2.63***2.64*2.65****2.66***2.67**2.68**2.69***2.70**2.71*2.72**2.73**2.74**2.75***2.76*2.55* 问&#xff1a;在你能访问的不同的机器上&#xff0c;编译show_bytes.c并运行代码&#xff0c;确定…...

Python操作MySQL数据库详细案例

Python操作MySQL数据库详细案例一、前言二、数据准备三、建立数据库四、处理和上传数据五、下载数据六、完整项目数据和代码一、前言 本文通过案例讲解如何使用Python操作MySQL数据库。具体任务为&#xff1a;假设你已经了解MySQL和知识图谱标注工具Brat&#xff0c;将Brat标注…...

MicroBlaze系列教程(8):AXI_CAN的使用

文章目录 @[toc]CAN总线概述AXI_CAN简介MicroBlaze硬件配置常用函数使用示例波形实测参考资料工程下载本文是Xilinx MicroBlaze系列教程的第8篇文章。 CAN总线概述 **CAN(Controller Area Network)**是 ISO 国际标准化的串行通信协议,是由德国博世(BOSCH)公司在20世纪80年代…...

网络安全领域中八大类CISP证书

CISP​注册信息安全专业人员 注册信息安全专业人员&#xff08;Certified Information Security Professional&#xff09;&#xff0c;是经中国信息安全产品测评认证中心实施的国家认证&#xff0c;对信息安全人员执业资质的认可。该证书是面向信息安全企业、信息安全咨询服务…...

stm32学习笔记-5EXIT外部中断

5 EXIT外部中断 [toc] 注&#xff1a;笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。 注&#xff1a;工程及代码文件放在了本人的Github仓库。 5.1 STM32中断系统 图5-1 中断及中断嵌套示意图 中断 是指在主程序运行过程中&#xff0c;出现了特定…...

MySQL Workbench 图形化界面工具

Workbench 介绍 MySQL官方提供了一款免费的图形工具——MySQL Workbench&#xff0c;它是一款功能强大且易于使用的数据库设计、管理和开发工具&#xff0c;总之&#xff0c;MySQL Workbench是一款非常好用的MySQL图形工具&#xff0c;可以满足大多数MySQL用户的需求。 目录 W…...

雪花算法(SnowFlake)

简介现在的服务基本是分布式、微服务形式的&#xff0c;而且大数据量也导致分库分表的产生&#xff0c;对于水平分表就需要保证表中 id 的全局唯一性。对于 MySQL 而言&#xff0c;一个表中的主键 id 一般使用自增的方式&#xff0c;但是如果进行水平分表之后&#xff0c;多个表…...

Linux防火墙

一、Linux防火墙Linux的防火墙体系主要在网络层&#xff0c;针对TCP/IP数据包实施过滤和限制&#xff0c;属于典型的包过滤防火墙&#xff08;或称为网络层防火墙&#xff09;。Linux系统的防火墙体系基于内核编码实现&#xff0c;具有非常稳定的性能和极高的效率&#xff0c;因…...

网络安全系列-四十七: IP协议号大全

IP协议号列表 这是用在IPv4头部和IPv6头部的下一首部域的IP协议号列表。 十进制十六进制关键字协议引用00x00HOPOPTIPv6逐跳选项RFC 246010x01ICMP互联网控制消息协议(ICMP)RFC 79220x02IGMP...

HTTP协议格式以及Fiddler用法

目录 今日良言:焦虑和恐惧改变不了明天,唯一能做的就是把握今天 一、HTTP协议的基本格式 二、Fiddler的用法 1.Fidder的下载 2.Fidder的使用 今日良言:焦虑和恐惧改变不了明天,唯一能做的就是把握今天 一、HTTP协议的基本格式 先来介绍一下http协议: http 协议(全称为 &q…...

自动写代码?别闹了!

大家好&#xff0c;我是良许。 这几天&#xff0c;GitHub 上有个很火的插件在抖音刷屏了——Copilot。 这个神器有啥用呢&#xff1f;简单来讲&#xff0c;它就是一款由人工智能打造的编程辅助工具。 我们来看看它有啥用。 首先就是代码补全功能&#xff0c;你只要给出函数…...

项目心得--网约车

一、RESTFULPost&#xff1a;新增Put&#xff1a;全量修改Patch&#xff1a;修改某个值Delete: 删除Get&#xff1a;查询删除接口也可以用POST请求url注意&#xff1a;url中不要带有敏感词&#xff08;用户id等&#xff09;url中的名词用复数形式url设计&#xff1a;api.xxx.co…...

【二叉树广度优先遍历和深度优先遍历】

文章目录一、二叉树的深度优先遍历0.建立一棵树1. 前序遍历2.中序遍历3. 后序遍历二、二叉树的广度优先遍历层序遍历三、有关二叉树练习一、二叉树的深度优先遍历 学习二叉树结构&#xff0c;最简单的方式就是遍历。 所谓二叉树遍历(Traversal)是按照某种特定的规则&#xff…...

Spring Cloud微服务架构必备技术

单体架构 单体架构&#xff0c;也叫单体应用架构&#xff0c;是一个传统的软件架构模式。单体架构是指将应用程序的所有组件部署到一个单一的应用程序中&#xff0c;并统一进行部署、维护和扩展。在单体架构中&#xff0c;应用程序的所有功能都在同一个进程中运行&#xff0c;…...

TCP三次握手与四次挥手(一次明白)

TCP基本信息 默认端口号:80 LINUX中TIME_WAIT的默认时间是30s TCP三次握手 三次握手过程:每行代表发起握手到另一方刚刚收到数据包时的状态 客户端服务端客户端状态服务端状态握手前CLOSELISTEN客户端发送带有SYN标志的数据包到服务端一次握手SYN_SENDLISTEN二次握手服务端发送…...

pyside6@Mouse events实例@QApplication重叠导致的报错@keyboardInterrupt

文章目录报错内容鼠标事件演示报错内容 在pyside图形界面应用程序开发过程中,通常只允许运行一个实例 假设您重复执行程序A,那么可能会导致一些意向不到的错误并且,从python反馈的信息不容易判断错误的真正来源 鼠标事件演示 下面是一段演示pyside6的鼠标事件mouseEvent对象…...

订单30分钟未支付自动取消怎么实现?

目录了解需求方案 1&#xff1a;数据库轮询方案 2&#xff1a;JDK 的延迟队列方案 3&#xff1a;时间轮算法方案 4&#xff1a;redis 缓存方案 5&#xff1a;使用消息队列了解需求在开发中&#xff0c;往往会遇到一些关于延时任务的需求。例如生成订单 30 分钟未支付&#xff0…...