深度分页、唯一索引的坑、分库分表、查询分离、连接池、bufferpool优化等

news2024/11/23 12:40:45

文章目录

  • 表过大
  • 深度分页
  • count(*) 与 count(列名)
  • 唯一索引
  • 分库分表
    • 只分库不分表
    • 不分库只分表
    • 分库也分表
  • 查询分离
    • 使用方法
    • 查询分离的适用场景
  • 冷热分离
    • 适用场景
    • 实现方案
  • 数据库连接池优化
  • 主键无序
  • buffer pool 太小
  • MySQL频繁抖动的性能优化
    • 原因
    • 解决

表过大

历史数据进行归档

深度分页

  1. 合理 建表 ,避免 大表的产生
  2. 冷热 数据分离
  3. 分库分表
  4. 避免跳转,比如 跳到第1000页,引发深度分页
  5. 限制 最大分页数
  6. 数据更新 不频繁,可以放入缓存!!!

count(*) 与 count(列名)

count(*) 不会忽略null

count(列名) 会忽略null

唯一索引

创建唯一索引的字段,不能为NULL 否则 唯一索引失效

逻辑删除的表,不方便建 唯一索引

逻辑删除表加个字段:deleteID 默认值为1
逻辑删除时,给deleteID设为当前的主键ID

name,model,deleteStatus,deleteID四个字段同时做成唯一索引

任何一个字段数值不同代表不是相同的数据, 可以保证数据唯一性

分库分表

只分库不分表

当数据库的读或者 写的QPS过高,导致数据库连接不足,考虑分库,增加 数据库实例的方式,提供更多的数据库连接提升系统并发度

不分库只分表

当单表数据量非常大,因为并发不高,数据库的连接可能还够,但存储和查询性能遇到瓶颈,考虑水平分表,将数据 拆分到多张表中,减少单表的数据量

分库也分表

  1. 数据库的读或者 写的QPS过高,导致数据库连接不足
  2. 单表数据量非常大

查询分离

使用方法

写请求使用主库,mysql等关系型数据库

读请求查询读库,采用nosql 如:es、mongodb、hbase

写读数据库的同步,采用binlog订阅

查询分离的适用场景

当在业务中遇到一下情形,考虑使用查询分离

  • 数据量大
  • 请求效率ok
  • 请求效率
  • 所有数据任何时候可能被修改
  • 希望优化查询数据的性能

冷热分离

适用场景

  1. 业务响应延迟 太大
  2. 数据走到终态,没有 更新的需求。只有读的需求,比如订单的完成状态
  3. 接受 新旧数据分开,比如 携程的订单查询30天之前 需要使用手机号

两个概念:

  • 冷数据:允许更新,偶尔查询,响应时间无要求
  • 热数据:被频繁更新,响应时间有要求

实现方案

在这里插入图片描述

在这里插入图片描述

数据库连接池优化

连接数 = ((核心数 * 2) + 有效磁盘数)

主键无序

导致页分裂,会去重新挪数据,影响性能

分布式id,每秒一个机器大概4000个id,跟时间线性相关的,如果时钟回拨会导致无序
高并发情况下可以先批量生成,再使用,根据业务情况估计

比如每秒100万的id,内存挂掉,将id持久化,或者扔掉重新生成~影响也不大redis的自增id

buffer pool 太小

可以通过下面的命令查询到 buffer pool 的大小,单位是 Byte。

mysql> show global variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.01 sec)
mysql> set global innodb_buffer_pool_size = 536870912;
Query OK, 0 rows affected (0.01 sec)
mysql> show global variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 536870912 |
+-------------------------+-----------+
1 row in set (0.01 sec)

怎么知道 buffer pool 是不是太小了?

这个我们可以看 buffer pool 的缓存命中率
在这里插入图片描述
查看 buffer pool 命中率

show status like 'Innodb_buffer_pool_%';

可以看到跟 buffer pool 有关的一些信息。
Innodb_buffer_pool_read_requests 表示读请求的次数
Innodb_buffer_pool_reads 表示从 物理磁盘中 读取数据的请求次数
所以 buffer pool 的命中率就可以这样得到:

buffer pool 命 中率 = 1 - (Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests) * 100%

比如我上面截图里的就是,1 - (405/2278354) = 99.98%。可以说命中率非常高了。
一般情况下 buffer pool 命中率都在 99% 以上,如果低于这个值,才需要考虑加大innodb buffer pool的大小

MySQL频繁抖动的性能优化

原因

在DB里执行查询或更新语句时,可能SQL语句性能会莫名抖动根本原因:

  • BP缓存页都满了,此时执行一个SQL查询大量数据,一下将大量缓存页flush到磁盘,刷磁盘太慢,导致你的查询语句执行就很慢

因为你必须 等大量缓存页都flush到磁盘,才能执行查询 从磁盘 将你所需数据页加载到BP缓存页

  • 执行更新语句时,redo log在磁盘上的所有文件都写满了

此时需要回到第一个redo log文件覆盖写,覆盖写时可能涉及到第一个redo log文件里有很多redo log日志对应的更新操作改动了缓存页,那些缓存页还没刷盘,就必须把它们刷盘了,才能执行更新语句,而你这一等待,必然会导致更新执行的很慢

所以上述两个场景导致的大量缓存页flush到磁盘,就会导致莫名SQL性能抖动

解决

假设 SSD能承载的随机 I/O 600 次/s,结果你把数据库的 innodb_io_capacity就设为300,即刷盘时随机I/O最多执行300次/s,那你速度就还是很慢啊,根本没压榨完SSD随机I/O性能

所以推荐对DB部署机器的SSD能承载的最大随机I/O速率做个测试fio工具常用来 测试磁盘最大随机I/O速率

即MySQL性能随机抖动问题,关键就是:

innodb_io_capacity 设为SSD 固态硬盘的IOPS,让他刷缓存页尽量快

同时设置 innodb_flush_neighbors0,让他每次 别刷临近缓存页,减少要刷缓存页的数量

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

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

相关文章

需求开发到一半需要改别的分支的bug该怎么办呢?(git stash 和 git commit)

在实际开发中,经常我们会遇到需求开发到一半,别的分支有bug急需解决的情况,这个时候我们改怎么办呢? 有的人会说可以先提交当前分支的代码再切换到别的分支改bug,当然这样是没问题的,但是呢,在项…

【计算机毕业设计】1.房屋租赁系统

一、系统截图(需要演示视频可以私聊) 摘要 当今社会房屋租赁、出售买卖是必不可少的,人们不管走到哪里都需要有一个温馨的家,有一个落脚之地,所以房屋租赁、出售市场也是非常火爆!不管是房屋租赁、出售、中…

基于conda的OpenCV库安装

基于conda的OpenCV库安装 OpenCV库的调用名是cv2 所以会看到这样的import语句 import cv2这句话就是对openCV库的调用 openCV库的下载安装 First 好像不需要像网上的教程那样, 首先去官网下载exe执行文件, 然后在VS中进行配置 直接在teminal中, 进入要指定的conda环境, …

编译原理实验--实验二 递归下降法判断算术表达式的正确性--Python实现

目录 一、实验目的和要求 二、实验内容 三、实验环境 四、实验步骤 1、语法分析所依据的文法; 2、给出消除左递归及提取左公因子的文法; 五、测试要求 六、实验步骤 1、语法分析所依据的文法 2、给出消除左递归及提取左公因子的文法&#xff1…

iNFTnews|国内数藏平台大撤退,寒冬之下海外市场是否有出路?

腾讯旗下继腾讯新闻、幻核之后,仅存的数藏平台也关停了。 11月16日,据界面新闻报道,腾讯TME旗下QQ音乐已经叫停“TME数字藏品”业务,原团队部分成员已内部活水。 一接近腾讯集团的知情人士称,腾讯方面曾对数字藏品业…

【Linux】生产者消费者模型

文章目录1.生产者消费者模型1.1生产者消费者模型的特点1.2生产者消费者模型的原则1.3生产者消费者模型的优点2.基于阻塞队列的生产者消费者模型2.1如何理解生产者消费者模型的并发?3.信号量3.1信号量接口3.2基于环形队列的生产者消费者模型3.3信号量和条件变量的区别…

Git_GitHub——基本操作、创建远程库、远程库操作、团队协作、SSH免密登录

网址:GitHub: Let’s build from here GitHub 目录 一、创建远程仓库 二、远程库操作 2.1 查看远程库别名 2.2 创建远程仓库别名 2.3 推送本地分支到远程仓库 2.4 拉取远程库到本地库 2.5 克隆远程库到本地 三、 跨团队协作 3.1 团队内协作 3.2 跨团队协作 四、SSH免密码登…

Go : golang发布三方包流程简介

文章目录一、创建项目仓库二、拉去仓库,编辑代码三、推送与发布代码四、使用发布的第三方包小结一、创建项目仓库 1.输入仓库的名字,我这里输入simpleExample,用来做演示 2.选择public,公开。要不并不好拉 3.选择需要添加的文件(…

用PyPy加速Python程序

用PyPy加速Python程序 在《Python性能优化指南–让你的Python代码快x3倍的秘诀》中有提到,我们可以用更好的Python运行环境或运行时优化来提升Python的速度,其中最成熟、使用最简单的当属PyPy。用PyPy,可以在不改变源代码的情况下&#xff…

二叉树相关OJ - C++

文章目录:根据二叉树创建字符串二叉树的层序遍历二叉树的最近公共祖先二叉搜索树与双向链表从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树二叉树的前序遍历(非递归)二叉树的中序遍历(非递归)二叉树的…

【LeetCode与《代码随想录》】数组篇:做题笔记与总结-Java版

代码随想录地址 是学习过程中的笔记!图来自代码随想录。 文章目录理论题目704. 二分查找35. 搜索插入位置34. 在排序数组中查找元素的第一个和最后一个位置69. x 的平方根367.有效的完全平方数理论 数组是存放在连续内存空间上的相同类型数据的集合。 数组下标都是…

[附源码]java毕业设计新能源汽车租赁管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

基于armv8的kvm实现分析(一)虚拟化介绍

本文基于以下软硬件假定: 架构:AARCH64 内核版本:5.14.0-rc5 1 什么是虚拟化 虚拟化就是把一台物理计算机虚拟成多台逻辑计算机,每台逻辑计算机里面可以运行不同操作系统,而相互之间不受影响,其典型架构…

面试了个 985 毕业的同学,回答“性能调优”题时表情令我毕生难忘

又逢“金九银十”,年轻的毕业生们满怀希望与忐忑,去寻找、竞争一个工作机会。已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而,面试人群众多,技术市场却相对冷淡,面…

JavaIO流:概述

在接触 IO 流前,无论是 变量的声明、数组的创建,又或者是复杂的并发设计还是 Jvm 的性能调优,我们更多的还是和内存打交道。但我们知道计算机组成包括运算器,控制器,存储器,输入设备,输出设备。…

springcloud4:服务注册中心Eureka

直接调用即可,为什么用Eureka什么是服务治理? 多个服务调用,需要有依赖中心管理什么是服务注册? 有一个注册中心,当服务器启动时,会把自己的信息注册到注册中心上什么是服务发现? Client通过注册…

electron打包ffi-napi报错 npm ERR! gyp reason: read ECONNRESET

问题描述 这个问题用了我两天的时间,所以记录一下。 我们项目是使用electronvue,做支付功能的时候需要使用到ffi-napi依赖包。 最后打包的时候ffi-napi报错了,在package.json中去掉ffi-napi就可以打包,但是打包运行后提示缺少ff…

re:Invent 2022,探秘亚马逊云科技的重量级计算创新——Nitro

诞生于16年前的亚马逊云科技,开创了一个全新的云计算领域。秉持着创新与探索精神,自2012年开始,在每年一度的re:Invent全球大会上,亚马逊云科技都会发布最新的云计算技术。对IT产业演进产生了革命性的影响,Nitro系统就…

Java笔记(工厂模式、动态代理、XML)

一、工厂模式 软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的复用性。 什么…

代码随想录算法训练营第四十三天| LeetCode1049. 最后一块石头的重量 II、LeetCode494. 目标和、LeetCode474. 一和零

一、LeetCode1049. 最后一块石头的重量 II 1:题目描述(1049. 最后一块石头的重量 II) 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将…