MySQL 性能瓶颈,为什么 MySQL 表的数据量不能太大?

      • MySQL的性能瓶颈(为什么MySQL有几万的qps,怎么来的?
          • 性能分析
      • 为什么 MySQL 表不能太大
          • 网上大部分人的说法:
          • 问题的关键: B+树层数对查询性能的影响到底有多大?
        • 是什么导致的 MySQL 查询缓慢?
        • 如何解决:

MySQL的性能瓶颈(为什么MySQL有几万的qps,怎么来的?

一个全表扫描的查询: 1000 万数据的全表扫描 2.1s

-- 千万数据-- 全表扫描(name 无索引)
--耗时: 2.1s
SELECT * FROM `user` WHERE name='sSehAepjIz';
性能分析
  1. tcp 性能 20 万, 在查询中的消耗几乎忽略不计(可以自己压一下)
  2. 内存性能千万级(自己压: map 性能两千万写,读 5 千万),性能几乎忽略不计
  3. 那么消耗几乎都在磁盘上面,磁盘 io 是多少?
    a. 一次 io 加载一页数据 16k
    b. 我的一行数据大概 60 字节,20 行假设 1k,
    c. 一次io 加载 16*20=320 行数据,1000 万行数据需要 io 3 万多次,总耗时 2s
    d. 结论: 1s 钟磁盘 io 1.5 万次左右,就是MySQL 的性能瓶颈(当然实际的应该更多,因为我的数据实际上是大小是算小了的,还有一些隐藏列什么的,实际值也应该在 1.5-2.5 万,反正差不多 2 万级别的)

为什么 MySQL 表不能太大

网上大部分人的说法:
  • MySQL 数据不要超过 2000w,b+树 3 层刚好可以大概容纳 2000w 数据(反正自己算吧),
  • 如果更多 b+树层数增多,io 次数就会更多,查询就会变慢.

b+树层数变多查询是会变慢,但是这是问题的关键?

问题的关键: B+树层数对查询性能的影响到底有多大?
  1. MySQL 磁盘 io 2 万的 qps, 一次 io 1 毫秒都不要
  2. b+树多一层容纳的数据量指数级增长(比如 3 层可以容纳 2000 万,4 层就可以容纳 200 亿行数据)
  3. b+树查询是多一层多一次 io, 查询语句就算用了 10 个索引,多 10 次 io 也就 几毫秒的事
  4. 结论 : 4 层b+树(200 亿数据)查询并不会太大的影响数据查询的性能,就影响几毫秒(几乎忽略)
是什么导致的 MySQL 查询缓慢?

上面已经分析了 MySQL 的性能瓶颈
● 内存 IO : 千万级 qps
● 网络IO: 20 万 qps(tcp)
● 磁盘IO: (2 万 qps)–瓶颈在这里

所以问题是磁盘 io 变多了,什么会导致磁盘 io 大量增长?

不是 B+树导致的磁盘 io 变多(b+树影响小,平均查询时间只会多几毫秒,MySQL 又是多线程的,并阻塞其他线程的查询任务);
而是需要提防的全表扫描
没有索引(索引不合理)
● 使用方法包裹索引字段
深度分页问题
这些全部都是全表扫描,巨慢,要扫描全表的数据,磁盘需要io 几万次(千万行), 几千万次(百亿行);

-- 千万数据-- 全表扫描(name 无索引)
--耗时: 2.1s
SELECT * FROM `user` WHERE name='sSehAepjIz';-- 索引扫描(create_time 有普通索引)
--耗时: 10ms(快到飞起)
SELECT * FROM `user` WHERE create_time='2024-12-27 04:14:53' ;
如何解决:
  • 首先要避免全表扫描,这很重要,大数据表的全表扫描就是巨慢,走索引就是快(磁盘 io 几万次与 io 几次的差距)
  • 避免一个表中的数量太多(分库分表)
  • 有的时候难免会使用全表扫描,不可能所有字段都加索引,(索引会影响写的性能 : 涉及到 b+树 分分合合的故事; 一般表的索引不会超过 5 个)这里时候需要保证请求最频繁的业务一定要加索引,哪些几百年不用几次的就可以不加.

参考:
https://juejin.cn/post/7165689453124517896,
https://cloud.tencent.com/developer/article/2303654,
https://developer.aliyun.com/article/631927

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

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

相关文章

Linux 实用命令 grep、wc

grep 命令详解 grep [选项] ‘模式’ 文件名 grep [参数] [选项] [操作对象]grep ‘error’ -c 5 --color info.log [模式]:是要搜索的字符串或正则表达式。 [选项]:是可选的,用于定制grep的行为。 [操作对象]:是要搜索的文件…

【Transformer】深入浅出自注意力机制

写在前面:博主本人也是刚接触计算机视觉领域不久,本篇文章是为了记录自己的学习,大家一起学习,有问题欢迎大家指出。(博主本人的习惯是看文章看到不懂的有立马去看不懂的那块,所以博文可能内容比较杂&#…

HarmonyOS NEXT 实战之元服务:静态案例效果---教育培训服务

背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: import { authentication } …

3.阿里云flinkselectdb-py作业

1.概述 Python API中文文档 本文介绍在阿里云实时计算flink中使用python作业,把oss中的数据同步数据到阿里云selectdb的过程。python简单的语法特性更适合flink作业的开发; 先说结论: 在实际开发中遇到了很多问题,导致python作业基本基本无法…

互联网视频云平台EasyDSS无人机推流直播技术如何助力野生动植物保护工作?

在当今社会,随着科技的飞速发展,无人机技术已经广泛应用于各个领域,为我们的生活带来了诸多便利。而在动植物保护工作中,无人机的应用更是为这一领域注入了新的活力。EasyDSS,作为一款集视频处理、分发、存储于一体的综…

51c视觉~YOLO~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12897680 1、Yolo9 1.1、YOLOv9SAM实现动态目标检测和分割 主要介绍基于YOLOv9SAM实现动态目标检测和分割 背景介绍 在本文中,我们使用YOLOv9SAM在RF100 Construction-Safety-2 数据集上实现自定义对象检测模…

Docker Container 可观测性最佳实践

Docker Container 介绍 Docker Container( Docker 容器)是一种轻量级、可移植的、自给自足的软件运行环境,它在 Docker 引擎的宿主机上运行。容器在许多方面类似于虚拟机,但它们更轻量,因为它们不需要模拟整个操作系统…

气相色谱-质谱联用分析方法中的常用部件,分流平板更换

分流平板,是气相色谱-质谱联用分析方法中的一个常用部件,它可以实现气相色谱柱流与MS检测器流的分离和分流。常见的气质联用仪分流平板有很多种,如单层T型分流平板、双层T型分流平板、螺旋分流平板等等。 操作视频http://www.spcctech.com/v…

易基因: BS+ChIP-seq揭示DNA甲基化调控非编码RNA(VIM-AS1)抑制肿瘤侵袭性|Exp Mol Med

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 肝细胞癌(hepatocellular carcinoma,HCC)早期复发仍然是一个具有挑战性的领域,其中涉及的机制尚未完全被理解。尽管微血管侵犯&#xff08…

鸿蒙系统文件管理基础服务的设计背景和设计目标

有一定经验的开发者通常对文件管理相关的api应用或者底层逻辑都比较熟悉,但是关于文件管理服务的设计背景和设计目标可能了解得不那么清楚,本文旨在分享文件管理服务的设计背景及目标,方便广大开发者更好地理解鸿蒙系统文件管理服务。 1 鸿蒙…

如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH

目录 一、什么是 Java 环境变量? 二、配置 Java 环境变量 1. 下载并安装 JDK 2. 配置 JAVA_HOME Windows 系统 Linux / macOS 系统 3. 配置 PATH Windows 系统 Linux / macOS 系统 4. 验证配置 三、常见问题与解决方案 1. 无法识别 java 或 javac 命令 …

Doris 数据库外部表-JDBC 外表,Oracle to Doris

简介 提供了 Doris 通过数据库访问的标准接口 (JDBC) 来访问外部表,外部表省去了繁琐的数据导入工作,让 Doris 可以具有了访问各式数据库的能力,并借助 Doris 本身的 OLAP 的能力来解决外部表的数据分析问题: 支持各种数据源接入…

分布式 IO 模块助力冲压机械臂产线实现智能控制

在当今制造业蓬勃发展的浪潮中,冲压机械臂产线的智能化控制已然成为提升生产效率、保障产品质量以及增强企业竞争力的关键所在。而分布式 IO 模块的应用,正如同为这条产线注入了一股强大的智能动力,开启了全新的高效生产篇章。 传统挑战 冲压…

CSS系列(37)-- Overscroll Behavior详解

前端技术探索系列:CSS Overscroll Behavior详解 📱 致读者:探索滚动交互的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Overscroll Behavior,这个强大的滚动行为控制特性。 基础概念 🚀 …

深度学习中的并行策略概述:4 Tensor Parallelism

深度学习中的并行策略概述:4 Tensor Parallelism 使用 PyTorch 实现 Tensor Parallelism 。首先定义了一个简单的模型 SimpleModel,它包含两个全连接层。然后,本文使用 torch.distributed.device_mesh 初始化了一个设备网格,这代…

企业销售人员培训系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库…

vue 本地自测iframe通讯

使用 postMessage API 来实现跨窗口(跨域)的消息传递。postMessage 允许你安全地发送消息到其他窗口,包括嵌套的 iframe,而不需要担心同源策略的问题。 发送消息(父应用) 1. 父应用:发送消息给…

Linux:code:network:devinet_sysctl_forward;IN_DEV_FORWARD

文章目录 简介sysctl 设置使用,arp_process间接使用IN_DEV_RX_REDIRECTSdev_disable_lro简介 最近在看Linux里的forwarding的功能。顺便在这里总结一下。有些详细代码逻辑,如果可以记录一下,会好一点。 sysctl 设置 这个函数在查看的时候需要注意的问题:变量名起的有点简…

自然语言处理与知识图谱的融合与应用

目录 前言1. 知识图谱与自然语言处理的关系1.1 知识图谱的定义与特点1.2 自然语言处理的核心任务1.3 二者的互补性 2. NLP在知识图谱构建中的应用2.1 信息抽取2.1.1 实体识别2.1.2 关系抽取2.1.3 属性抽取 2.2 知识融合2.3 知识推理 3. NLP与知识图谱融合的实际应用3.1 智能问答…

PHP 数组

PHP 数组 PHP 是一种流行的服务器端编程语言,它提供了强大的数组处理能力。PHP 数组是一种数据结构,用于存储相同类型或不同类型的多个值。在 PHP 中,数组可以分为一维数组、二维数组和多维数组。本文将详细介绍 PHP 数组的各种操作&#xf…