数据库——数据库性能优化

ops/2024/9/18 12:21:02/ 标签: 数据库, 性能优化, oracle

title: 数据库——数据库性能优化
date: 2024-07-06 12:26:21
tags: 数据库
categories: 数据库
cover: /image/T1.jpg
description: 数据库——MySQL的性能优化

数据库优化

系统的吞吐量瓶颈往往出现在数据库的 访问速度 上,随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢,因为其数据是存放在 磁盘 上的,读写速度无法和内存相比,所以使用数据库时,十分有必要了解数据库优化问题。其优化原则为:减少系统瓶颈,减少资源占用,增加系统的反应速度。

数据库结构优化
优化目标:
  1. 减少数据冗余:确保相同的数据不会在多个地方重复存储,减少数据更新和维护的复杂性。
  2. 避免数据维护异常:包括插入异常、更新异常和删除异常,确保数据库操作的正确性和一致性。
  3. 节约存储空间:通过合理设计表结构和数据类型,减少不必要的存储空间浪费。
  4. 提高查询效率:优化表结构和索引,加快数据检索速度,提升系统性能。
优化策略:

数据库设计中,针对字段很多或查询复杂的情况,采用表分解、增加中间表(以及合理添加冗余字段是常见的优化策略。

  1. 表分解(Normalization)
    将大表分解成多个小表,每个表专注于一组相关的数据,通过外键关联。这有助于减少数据冗余,提高数据一致性,并使数据库结构更清晰。

  2. 增加中间表(Denormalization for Query Optimization)
    为优化查询性能,可以创建中间表来存储频繁联合查询的结果。这样做可以减少查询时的连接操作,提高查询速度,但会增加数据冗余和更新维护的复杂性。

  3. 合理添加冗余字段
    在不影响数据一致性的前提下,为了减少查询时的连接操作,可以在表中添加一些冗余字段。这些字段存储了原本需要通过联合查询才能获得的数据,从而提高了查询效率,但增加了数据更新的复杂性和存储成本。

分库分表

分库分表是数据库架构设计的一种策略,旨在通过将大量数据分散存储到多个数据库或表中,以提升系统的性能、可扩展性和可用性。这种方法主要用于处理海量数据和高并发访问的情况。

分库分表通过“垂直切分”或“水平切分”的方式,将数据库或表拆分成多个较小的部分。垂直切分通常按业务模块划分,将不同业务的数据放在不同的数据库或表中。水平切分则根据数据的某种特征(如用户ID、时间等)将数据分散到多个数据库或表中。

这种策略的主要目的是减轻单一数据库或表的压力,提高查询和写入速度,同时支持系统的水平扩展,即通过增加更多的数据库或表来应对数据量的增长。此外,分库分表还能提高系统的可用性,因为即使某个数据库或表出现问题,其他部分仍然可以正常工作。

垂直切分和水平切分
  • 垂直切分:将表中的字段按照业务逻辑进行拆分,将相关的字段放在一起,形成一个新表。这种方式适用于按业务模块划分数据的场景。

  • 水平切分:将表中的数据按照某个规则(如用户ID、时间范围等)分散到多个数据库中,每个数据库存储部分数据。这种方式适用于数据量大的场景,可以有效缓解单一数据库的性能瓶颈。

可能的问题
  • 跨节点查询和事务一致性问题:分库分表后可能会面临跨节点查询和事务一致性的问题。这需要通过合理的设计和优化来解决,如使用分布式事务、数据一致性校验等机制。
  • 数据迁移和扩容问题:在分库分表后,随着业务的发展可能需要进行数据迁移和扩容。这需要提前规划好数据迁移和扩容的策略和方案,以确保系统的平稳运行。
MySQL主从复制

主从复制是指将 主数据库(Master)中的 DDL 和 DML 操作通过二进制日志传输到 从数据库(Slave) 上,然后将这些日志重新执行(重做),从而使得从数据库的数据与主数据库保持一致。MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。

主从复制原理

MySQL 的主从复制是一个 异步 的复制过程(一般情况下感觉是实时的),数据将从一个 MySQL 数据库(Master)复制到另外一个 MySQL 数据库(Slave),在 Master 与 Slave 之间实现整个主从复制的过程是由三个线程参与完成的,其中有两个线程(SQL 线程和 I/O 线程)在 Slave 端,另外一个线程( I/O 线程)在 Master 端。

主从复制的作用有

  • 当主数据库出现问题时,可以切换到从数据库
  • 可以进行数据库层面的读写分离,实现负载均衡;
  • 可以在从数据库上进行实时数据备份。
MySQL读写分离的实施方案

MySQL 读写分离的实现方式主要基于 主从复制,通过 路由的方式 使应用对数据库的写请求只在 Master 上进行,读请求在 Slave 上进行。

具体地,有以下四种实现方案:

  • 方案一:基于 MySQL proxy 代理

    在应用和数据库之间增加 代理层,代理层接收应用对数据库的请求,根据不同请求类型(即是读 read 还是写 write)转发到不同的实例,在实现读写分离的同时可以实现负载均衡。MySQL 的代理最常见的是 mysql-proxy、cobar、mycat、Atlas 等。

  • 方案二:基于应用内路由

    基于应用内路由的方式即为在应用程序中实现,针对不同的请求类型去不同的实例执行 SQL。具体实现可基于 spring 的 aop:用 aop 来拦截 spring 项目的 dao 层方法,根据方法名称就可以判断要执行的类型,进而动态切换主从数据源。

  • 方案三:基于 MySQL-Connector-Java 的 JDBC 驱动方式

    Java 程序通过在连接 MySQL 的 JDBC 中配置主库与从库等地址,JDBC 会自动将读请求发送给从库,将写请求发送给主库,此外, MySQL 的 JDBC 驱动还能够实现多个从库的负载均衡。

  • 方案四:基于 sharding-jdbc 的方式

    sharding-sphere 是强大的读写分离、分表分库中间件,sharding-jdbc 是 sharding-sphere 的核心模块。


http://www.ppmy.cn/ops/55563.html

相关文章

5G频段简介

5G频段 5G网络一共有29个频段,主要被分为两个频谱范围,其中6GHz以下的频段共有26个(统称为Sub6GHz),毫米波频段有3个。目前国内主要使用的是Sub6GHz,包括n1/n3/n28/n41/n77/n78/n79共7个频段。具体介绍如下…

Newport太阳光模拟器MSOL-UV-X使用说明手侧

Newport太阳光模拟器MSOL-UV-X使用说明手侧

【Android】自定义换肤框架01之皮肤包制作

前言 目前为止,市面上主流的安卓换肤方案,其实原理都是差不多的 虽然大多都号称一行代码集成,但其实想要做到完全适配,并不简单 这个系列,就是让大家从零开始,完全掌握这方面知识,这样才能对…

c/c++ 程序运行的过程分析

c/c编译基础知识 GNU GNU(GNU’s Not Unix!)是一个由理查德斯托曼(Richard Stallman)在1983年发起的自由软件项目,旨在创建一个完全自由的操作系统,包括操作系统的内核、编译器、工具、库、文本编辑器、邮…

BDD 100K dataset 的标签数据结构(json文件)

最近在筛选自己需要的labels,所以要弄清楚这个数据集的数据结构才行: 1.整个json文件以列表形式储存 2.每张图片以一个字典形式储存 3.存储图片的字典内的以‘name’为key的键值对对应的‘value’是我需要的图片名称信息 4.存储图片的字典内的以‘label…

【Arm技术日:为AI终端准备了哪些新基石?】

过去一年,移动终端设备的长足进步令人赞叹,例如人工智能 (AI) 从手机到笔记本电脑的巨大创新,并诞生了“新一代 AI 手机”和 AIPC。据IDC预测,2024年全球新一代AI手机的出货量将达到1.7亿部,占智能手机市场总量的近15%…

Spark on k8s 源码解析执行流程

Spark on k8s 源码解析执行流程 1.通过spark-submit脚本提交spark程序 在spark-submit脚本里面执行了SparkSubmit类的main方法 2.运行SparkSubmit类的main方法,解析spark参数,调用submit方法 3.在submit方法里调用doRunMain方法,最终调用r…

Arthas实战(5)- 项目性能调优

1、接口耗时查询:trace命令 trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。 1.1 准备测试应用 新建一个 SpringBoot 应用,写一耗时久的代码&…

Android动态设置系统音量最大值

产品需求 通过设定最大音量限制大屏声音输出,设置完后需要立即生效且需要记忆;以10%为递增状态,设置最大音量后,无论最大音量调节至多少百分比,音量条始终显示为100%(比如最大音量设置为80%,即…

浏览器怎么抓包?Wireshark详细教程奉上!

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

使用 HTTPS 已成为网站的标配了

网站使用HTTPS的原因 背景:十年前,HTTPS并不普遍,但随着网络安全意识的提高,现在已成为网站标配。 网站升级到HTTPS的动机 安全问题:HTTP缺乏安全机制,易被窃取和篡改数据。例如,电信运营商劫…

大话C语言:第26篇 静态库

1 静态库概述 C语言静态库(Static Library)是一种包含一组目标文件的归档文件,这些目标文件通常是由多个C语言源文件编译而成的。静态库在程序编译时被链接到目标程序中,成为程序的一部分,因此在运行时不再需要额外的…

【6】图像分类部署

【6】图像分类部署 文章目录 前言一、将pytorch模型转为ONNX二、本地终端部署2.1. ONNX Runtime部署2.2. pytorch模型部署(补充) 三、使用flask的web网页部署四、微信小程序部署五、使用pyqt界面化部署总结 前言 包括将训练好的模型部署在本地终端、web…

uniapp组件通讯

1、父组件跳转页面时通过eventChannel设置监听事件: // 在起始页面跳转到test.vue页面,并监听test.vue发送过来的事件数据 uni.navigateTo({url: /pages/test?id1,events: {// 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据…

MyBatis(26)MyBatis 有哪些方式可以实现多数据源管理

在企业级应用开发中,有时需要同时操作多个数据库,这就涉及到多数据源管理的问题。MyBatis作为一个流行的持久层框架,本身并没有直接提供多数据源管理的功能,但是可以通过与Spring等框架结合,或者通过自定义方式来实现多…

ESP32CAM物联网教学05

ESP32CAM物联网教学05 超级监控摄像头 点灯科技APP还能查看摄像头的视频呢!这样,小智的物联网小车就变身成为超级监控摄像头啦。 测试摄像头视频图像 我们把前面的物联网小车的程序稍作修改,增加了摄像头的程序,去掉了按键组件程…

每天五分钟计算机视觉:人体姿势识别

本文重点 人体姿势识别是计算机视觉领域的一个重要研究方向,旨在通过图像或视频数据自动检测并识别出人体的各种姿势和动作。随着深度学习技术的快速发展,基于神经网络的方法在这一领域取得了显著进展。神经网络,特别是卷积神经网络(CNN)和循环神经网络(RNN),因其强大…

华为OD面试分享18

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 正文开始 7月3日上午一面 问项目 String变量直接引用和new一个String变量的区别 谈谈多线程 canel的工作原理 MVC的执行过程 redis怎么用的 编程题-网络连通区域数量 7月3日晚上二面 编程…

CTF入门知识点

CTF知识点 md5函数 <?php$a 123;echo md5($a,true); ?> 括号中true显示输出二进制 替换成false显示输出十六进制绕过 ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c&#xff0c;这个字符串前几位刚好是 or 6 而 Mysql 刚好又会把 …

Vue联调Java后台操作性强教程

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…