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

news/2024/12/28 11:15:55/

      • 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.ppmy.cn/news/1558774.html

相关文章

教师管理系统

大概功能: 1.显示所有教师 2.按姓名查找教师 3.按工号查找教师 4.增加教师 5.删除教师 6.退出 数据会保存到 txt 文件里面 姓名:必须是中文 手机号码:必须是11位,必须是数字 效果展示: 代码展示: Teache…

vue2/3,Spring Boot以及生产环境跨域解决方案

vue2和vue3跨域解决方案 Vue 2 (基于 Webpack) 的跨域解决方案 1. 创建或编辑 vue.config.js 文件 Vue CLI为Webpack项目提供了简单的代理配置方式。你可以通过创建或编辑项目的根目录下的 vue.config.js 文件来设置开发服务器的代理规则: // vue.config.js mod…

第七节:GLM-4v-9b模型的视觉模型源码解读

文章目录 前言一、EVA2CLIPModel视觉编码模块结构二、PatchEmbedding图像分块源码解读三、GLM的transformer结构源码解读四、GLU映射方法源码解读前言 清华智普的GLM-4v-9b模型,作为优化的多模态大模型,特别适用于国内应用场景,解决了国外模型本地化不足的问题。本专栏提供…

Docker离线安装简易指南

Docker离线安装简易指南: 📦 下载安装包:浏览器访问Docker官网下载https://download.docker.com/linux/static/stable/x86_64/docker-27.4.1.tgz ,并上传服务器 scp docker-27.4.1.tgz root服务器IP:/服务器目录/💾 解…

掌握Docker命令与Dockerfile实战技巧:快速构建高效容器化应用

1. 介绍 Docker 是现代开发和运维的必备工具,集成了容器技术的优势。本文将记录 Docker 的常用指令,并会随着使用经验的积累进行不定期更新。 2. 常用命令 2.1 启动容器(前台交互模式) docker run --privileged --volume /hom…

npm : 无法加载文件 D:\Nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本

npm : 无法加载文件 D:\Nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本 1、问题详情 npm : 无法加载文件 D:\Nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本,具体如下图所示: 2、解决方法 1.使用命令 get-Ex…

PDF书籍《手写调用链监控APM系统-Java版》第7章 插件与链路的结合:Tomcat插件实现

本人阅读了 Skywalking 的大部分核心代码,也了解了相关的文献,对此深有感悟,特此借助巨人的思想自己手动用JAVA语言实现了一个 “调用链监控APM” 系统。本书采用边讲解实现原理边编写代码的方式,看本书时一定要跟着敲代码。 作者…

Vue 3 具名插槽传值详解

Vue 3 具名插槽传值详解 Vue 3 的具名插槽不仅支持内容插入,还支持通过作用域插槽传递值(又称插槽作用域)。这使得父组件能够动态接收来自子组件的数据,从而实现更加灵活的组件开发。 在本文中,我们将深入讲解 Vue 3…