PostgreSQL、SQL Server和MySQL数据库性能调优与故障排除技术

通过结合具体技术特性与工具链的深度使用,可系统化提升数据库性能和稳定性。建议根据实际负载特征制定监控-分析-优化的闭环管理流程。

数据库技术:

  • PostgreSQL 13+:逻辑复制、分区表、并行查询、监控工具(如pg_stat_statements、pgBadger)。
  • MySQL 5.7+:InnoDB Cluster、性能模式(Performance Schema)、JSON支持、GTID复制。
  • SQL Server 2016+:Always On Availability Groups、索引优化、执行计划分析(Query Store)、统计信息维护。

性能调优与故障排除:

  • 索引优化策略、慢查询分析(EXPLAIN语句)、缓存机制(如Redis与数据库结合)。
  • 死锁诊断、连接池管理、资源调控(如Azure SQL DB的DTU/VCore管理)。
  • 工具使用:SQL Server Profiler、pgAdmin、MySQL Workbench、Azure Monitor。

一、数据库技术深度解析

1. PostgreSQL 13+

(1)逻辑复制

  • 原理:基于发布-订阅模式,以事务粒度复制数据变更,支持跨版本/跨库复制
  • 场景:跨云数据库同步(AWS RDS -> Azure PostgreSQL),异构数据迁移(PostgreSQL到Kafka)
  • 示例
    -- 发布端
    CREATE PUBLICATION sales_publication FOR TABLE orders, customers;-- 订阅端 
    CREATE SUBSCRIPTION sales_subscription
    CONNECTION 'host=primary.db port=5432' 
    PUBLICATION sales_publication;
    

(2)分区表

  • 策略:支持Range/List/Hash分区,通过PARTITION BY定义
  • 优化:结合pg_partman扩展实现自动分区维护
  • 示例:电商订单表按月份分区
    CREATE TABLE orders (order_id SERIAL,order_date DATE
    ) PARTITION BY RANGE (order_date);CREATE TABLE orders_2023q1 PARTITION OF ordersFOR VALUES FROM ('2023-01-01') TO ('2023-04-01');
    

(3)并行查询

  • 配置max_parallel_workers_per_gather控制并行度
  • 案例:大表JOIN查询速度提升3倍(4核服务器)

(4)监控工具

  • pg_stat_statements:统计SQL执行耗时
    SELECT query, calls, total_time 
    FROM pg_stat_statements 
    ORDER BY total_time DESC LIMIT 10;
    
  • pgBadger:分析日志生成HTML报告
    pgbadger /var/log/postgresql/postgresql-13-main.log -o report.html
    

2. MySQL 5.7+

(1)InnoDB Cluster

  • 架构:基于MySQL Shell+Group Replication构建高可用集群
  • 部署
    // 初始化集群
    dba.configureInstance('user@node1:3306')
    const cluster = dba.createCluster('prodCluster')// 添加节点
    cluster.addInstance('user@node2:3306')
    

(2)Performance Schema

  • 应用:监控锁竞争
    SELECT * FROM performance_schema.data_locks 
    WHERE LOCK_STATUS = 'WAITING';
    

(3)JSON支持

  • 操作
    UPDATE products 
    SET attributes = JSON_SET(attributes, '$.color', 'blue')
    WHERE product_id = 100;
    

(4)GTID复制

  • 优势:全局事务标识实现精确故障转移
  • 配置
    [mysqld]
    gtid_mode=ON
    enforce_gtid_consistency=ON
    

3. SQL Server 2016+

(1)AlwaysOn AG

  • 部署:通过SSMS向导创建可用性组,配置侦听器IP
  • 故障转移
    ALTER AVAILABILITY GROUP [AG1] FAILOVER;
    

(2)索引优化

  • 缺失索引建议
    SELECT * FROM sys.dm_db_missing_index_details;
    

(3)Query Store

  • 使用:强制历史执行计划
    EXEC sp_query_store_force_plan @query_id=102, @plan_id=45;
    

二、性能调优与故障排除

1. 核心优化策略

(1)索引优化

  • 复合索引设计(status, created_at)优化WHERE status='paid' ORDER BY created_at
  • 索引类型选择:GIN索引加速JSONB字段查询

(2)慢查询分析

  • EXPLAIN实战
    EXPLAIN (ANALYZE, BUFFERS)
    SELECT * FROM orders WHERE total_amount > 1000;
    
    • 关键指标:Seq Scan耗时、Filter过滤行数

(3)缓存整合

  • Redis缓存方案
    def get_order(order_id):cache_key = f"order:{order_id}"data = redis.get(cache_key)if not data:data = db.query("SELECT * FROM orders WHERE id=?", order_id)redis.setex(cache_key, 3600, data)return data
    

2. 故障处理

(1)死锁诊断

  • MySQL死锁日志
    LATEST DETECTED DEADLOCK
    *** (1) TRANSACTION: UPDATE accounts SET balance=... WHERE user_id=1
    *** (2) TRANSACTION: UPDATE accounts SET balance=... WHERE user_id=2
    

(2)连接池管理

  • HikariCP配置
    HikariConfig config = new HikariConfig();
    config.setMaximumPoolSize(20);
    config.setConnectionTimeout(30000);
    

(3)Azure资源调控

  • DTU与VCore对比
    指标DTU模型vCore模型
    计算单位混合度量独立CPU/Mem
    扩展粒度固定层级灵活配置

3. 工具链应用

  • SQL Server Profiler:捕获死锁事件链
  • pgAdmin仪表板:实时监控锁状态
  • Azure Monitor:设置自动缩放规则
    "autoscale": {"metricTrigger": {"metricName": "dtu_consumption_percent","operator": "GreaterThan","threshold": 80},"scaleAction": {"direction": "Increase","type": "ChangeCount","value": "1"}
    }
    

三、典型场景案例

案例1:电商系统慢查询优化

  • 现象:订单分页查询超时
  • 分析EXPLAIN显示全表扫描+文件排序
  • 方案
    1. 创建(user_id, created_at)复合索引
    2. 使用WHERE created_at > '2023-01-01'分区裁剪

案例2:MySQL死锁频发

  • 根因:多线程逆序更新相同记录
  • 解决:统一更新顺序(按主键排序更新)

案例3:Azure SQL DTU超限

  • 优化
    1. 启用查询存储识别TOP 10高消耗查询
    2. 添加缺失索引降低逻辑读次数
    3. 将报表查询迁移到只读副本

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

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

相关文章

不同开发语言之for循环的用法、区别总结

一、Objective-C &#xff08;1&#xff09;标准的c风格 for (int i 0; i < 5; i) {NSLog("i %d", i); } &#xff08;2&#xff09;for in循环。 NSArray *array ["apple", "banana", "orange"]; for (NSString *fruit in …

ctfshow做题笔记—栈溢出—pwn65~pwn68

目录 前言 一、pwn65(你是一个好人) 二、pwn66(简单的shellcode&#xff1f;不对劲&#xff0c;十分得有十二分的不对劲) 三、pwn67(32bit nop sled)&#xff08;确实不会&#xff09; 四、pwn68(64bit nop sled) 前言 做起来比较吃力哈哈&#xff0c;自己还是太菜了&…

Git基础之工作原理

基础概念 git本地有三个工作区域&#xff0c;工作目录 Working Directory&#xff0c;暂存区Stage/Index和资源区Repository/Git Directory&#xff0c;如果在加上远程的git仓库就是四个工作区域 四个区域与文件交换的命令之间的关系 WorkSpace&#xff1a;工作区&#xff0c;就…

Linux 指定命令行前后添加echo打印内容

目录 一. 前提条件二. 通过sh脚本进行批量修改三. 通过Excel和文本编辑器进行批量转换四. 实际执行效果 一. 前提条件 ⏹项目中有批量检索文件的需求&#xff0c;如下所示需要同时执行500多个find命令 find ./work -type f -name *.java find ./work -type f -name *.html fi…

Immich自托管服务的本地化部署与随时随地安全便捷在线访问数据

文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 小伙伴们&#xff0c;你们好呀&#xff01;今天要给大家揭秘一个超炫的技能——如何把自家电脑变成私人云相册&#xff0c;并…

pytorch 50 大模型导出的onnx模型优化尝试

本博文基于Native-LLM-for-Android项目代码实现,具体做了以下操作: 1、尝试并实现将模型结构与权重零散的onnx模型进行合并,通过该操作实现了模型加载速度提升,大约提升了3倍 2、突破了onnxconverter_common 无法将llm模型导出为fp16的操作,基于该操作后将10g的权重降低到…

Training-free Neural Architecture Search for RNNs and Transformers(预览版本)

摘要 神经架构搜索 (NAS) 允许自动创建新的有效神经网络架构&#xff0c;为手动设计复杂架构的繁琐过程提供了替代方案。然而&#xff0c;传统的 NAS 算法速度慢&#xff0c;需要大量的计算能力。最近的研究调查了图像分类架构的无训练 NAS 指标&#xff0c;大大加快了搜索算…

c++_二叉树的介绍

内存模型 一.内存中有代码区&#xff1b;栈区&#xff1b;数据段 堆区 1、栈区存放了函数所有局部变量和形参&#xff1b; 它的局限在于&#xff1a;局部变量和形参的生存期&#xff1b;即函数返回后对象就会被回收 解决方案是&#xff1a;1&#xff09;使用全局变量 &…

②Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网

Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网https://item.taobao.com/item.htm?ftt&id784749793551 网关 MS-A1-5081 MS-A1-5081 网关通过 MODBUS TCP 协议与 Modbus RTU/ASCII 协议的相互转换&#xff0c;可以将 Modbus 串口设备接入 MODBUS TCP 网络…

[网络爬虫] 动态网页抓取 — Selenium 元素定位

&#x1f31f;想系统化学习爬虫技术&#xff1f;看看这个&#xff1a;[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客 在使用 Selenium 时&#xff0c;往往需要先定位到指定元素&#xff0c;然后再执行相应的操作。例如&#xff0c;再向文本输入框中输入文字之前&#xff0c;…

vue实现一个pdf在线预览,pdf选择文本并提取复制文字触发弹窗效果

[TOC] 一、文件预览 1、安装依赖包 这里安装了disjs-dist2.16版本&#xff0c;安装过程中报错缺少worker-loader npm i pdfjs-dist2.16.105 worker-loader3.0.8 2、模板部分 <template><div id"pdf-view"><canvas v-for"page in pdfPages&qu…

Java零基础入门笔记:多线程

前言 本笔记是学习狂神的java教程&#xff0c;建议配合视频&#xff0c;学习体验更佳。 【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili 第1-2章&#xff1a;Java零基础入门笔记&#xff1a;(1-2)入门&#xff08;简介、基础知识&#xff09;-CSDN博客 第3章…

【VUE2】第三期——样式冲突、组件通信、异步更新、自定义指令、插槽

目录 1 scoped解决样式冲突 2 data写法 3 组件通信 3.1 父子关系 3.1.1 父向子传值 props 3.1.2 子向父传值 $emit 3.2 非父子关系 3.2.1 event bus 事件总线 3.2.2 跨层级共享数据 provide&inject 4 props 4.1 介绍 4.2 props校验完整写法 5 v-model原理 …

蓝桥杯刷题周计划(第二周)

目录 前言题目一题目代码题解分析 题目二题目代码题解分析 题目三题目代码题解分析 题目四题目代码题解分析 题目五题目代码题解分析 题目六题目代码题解分析 题目七题目代码题解分析 题目八题目题解分析 题目九题目代码题解分析 题目十题目代码题解分析 题目十一题目代码题解分…

Redis渐进式遍历数据库

目录 渐进式遍历 数据库 渐进式遍历 keys*可以一次性的把整个redis中所有key都获取到&#xff0c;这个操作是非常危险的&#xff0c;因为可能一下获取到太多的key&#xff0c;阻塞redis服务器。要想很好的获取到所有的key&#xff0c;又不想出现卡死的情况&#xff0c;就可以…

一周学会Flask3 Python Web开发-使用SQLAlchemy动态创建数据库表

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 前面我们定义了模型&#xff0c;我们可以通过sqlalchemy对象提供的create_all()方法来映射和动态创建数据库表。 因为我们用到…

android studio2024最新详解(完全小白)安装-运行第一个程序

前面我用2023最新版本的&#xff0c;死活就卡在引入依赖那里卡了两天&#xff0c;俺的崩溃谁知啊&#xff01;&#xff01; 后面我就换了个思维&#xff0c;看着网上大多的教程都是基于2022或者2020的&#xff0c;我就找了个看起来非常详细的视频&#xff0c;里面的是2020的&am…

laravel中 添加公共/通用 方法/函数

一&#xff0c;现在app 下面创建Common目录&#xff0c;然后在创建Common.php 文件 二&#xff0c;修改composer.json文件 添加这个到autoload 中 "files": ["app/Common/Common.php"]"autoload": {"psr-4": {"App\\": &quo…

c语言笔记 函数参数的等价(上)

这三种写法在 C 语言中是等价的&#xff0c;因为它们都用于声明一个指向二维数组的指针&#xff0c;或者用于声明一个二维数组作为函数参数。它们的等价性源于 C 语言中数组和指针之间的密切关系。让我们逐一分析这三种写法&#xff1a; 在C语言中&#xff0c;当数组作为函数参…

ubuntu局域网部署stable-diffusion-webui记录

需要局域网访问&#xff0c;如下设置&#xff1a; 过程记录查看源码&#xff1a; 查看源码&#xff0c;原来修改参数&#xff1a;--server-name 故启动&#xff1a; ./webui.sh --server-name0.0.0.0 安装下载记录&#xff1a; 快速下载可设置&#xff1a; export HF_ENDPOI…