数据库优化(底层基础优化)

数据库层面的优化是性能“基础", 主要包含架构设计、存储引擎、表结构、索引策略、配置参数等方面考虑。目标是减少资源(CPU、IO和内存)消耗。

架构设计

  • 读写分离:将"读操作"和"写操作"分离到不同的数据库节点。
    • 主库(Master):负责写操作(INSERT/UPDATE/DELETE),保证数据一致性。
    • 从库(Slave):负责读操作(SELECT),通过主从复制(基于binlog)同步主库数据,
    • 适用场景:读多写少的业务(如电商商品详情页,新闻网站),可通过增加从库数量分摊读压力。
  • 分库分表:当单表数据量过大时(超千万行),或单库压力过高时,需拆分数据。
    • 水平分表(按行拆分):将表数据按照不同行拆分到多表。(结构相同)。如按照时间拆分。
    • 垂直分表(按列拆分):将大表中不常用的字段 拆分到子表中(减少单表宽度)
    • 分库:将多个表拆分到不同数据库(如按照业务模块分库:用户表、订单库)
  • 使用缓存缓解数据库压力
    • 对高频访问且不常变化的数据(如商品分类、热门文章)通过Redis。Memcached等缓存中间件缓存,减少数据库的查询次数。
    • 注意:需要处理缓存一致性(如更新数据库后同步更新缓存)和缓存穿透/击穿/雪崩问题。
  • 存储引擎优化:选择合适的存储引擎时性能优化的关键,需要根据业务场景匹配特性:
    • 优先选择InnoDB(MySQL 5.5默认):
      适合需要外键、事务、行级锁、崩溃恢复的场景
      • 优化点:调整innodb_Buffer_pool_size(建议设为物理内存的50%~70%),减少IO。
      • 开启innoDB_Flush_log_at_trx_commit(默认)保证事务持久性,若允许少量数据丢失可设置为2.提升性能。
    • MYISAM:适用于 读多写少,无需事务(如日志、静态数据),优势索引缓存效率高,但不支持事务和行锁。崩溃后回复困难。
  • 表结构设计优化:合理设计表结构 能够减少存储空间,提升查询效率。核心原则:精简、合适、平衡范式于反范式
    • 数据类型选择:最寻最小够用,避免大类型存储小数据
    • 平衡范式和反范式:
      • 范式(1NF~3NF):减少冗余(如避免同一字段再多表中重复)。但会导致多表联查增多。
      • 反范式:适量增加冗余,减少JOIN操作,提高性能。
    • 避免过度设计:
      • 不过多适用外键(外键会增加写操作开销)
      • 合理设置表中字段(建议不超过20个),过多会导致IO和内存消耗。
  • 核心索引设计原则:
    • 为WHERE、JOIN、GROUP BY的字段建立索引。
    • 遵循联合索引"最左匹配原则”
    • 优先分区分度大的字段建立索引。
  • 避免索引失效
    • 索引字段适用函数/运算。
    • OR连接无索引字段。
    • 字符串不加引号,导致类型转换
    • 范围查询左边以%开始
    • NOT IN,!=,<>
  • 索引维护
    • 定期删除冗余索引(如主键已索引,旧无需再建立二级索引)。
  • 相关配置设置,通过调整MYSQL配置文件(my.config/my.ini)提升性能,
    • 内存相关:
    • innodb_buffer_pool_size:Innodb缓冲池大小(一般为物理内存的50%~70%).
    • key_buffer_size:MyISAM 索引缓存大小(仅用于 MyISAM 表)。
  • IO相关
    • innodb_flush_log_at_trx_commit:控制 redo log 刷新策略(1 = 每次提交刷盘,最安全;2 = 每秒刷盘,性能更好)。
    • sync_binlog:控制 binlog 刷新策略(1 = 每次提交刷盘,主从同步更可靠;0 = 由 OS 决定,性能高但有丢失风险)。
  • 连接相关:
    • max_connections:最大连接数(默认 151,需根据并发量调整,避免连接数不足)。
    • wait_timeout:空闲连接超时时间(释放长期闲置的连接,默认 8 小时)。

语句优化

针对单条语句的执行效率,尽可能让SQL走索引。核心通过EXPLAIN分析执行计划,优化语法

  • 避免全表扫描(type:ALL),全表扫描(遍历表中所有行),

    • 明确查询条件:WHERE子句必须包含索引字段(或能触发索引的条件)。
    • 反例:SELECT * FROM user(无WHERE,必全表扫描,除非表极小)。
  • 优化查询字段:

    • 避免SELECT*:只需要查询需要的字段,减少数据传输和IO,且尽可能避免回表。
    • 减少SELECT DISTINCT:DISTINCT会触发排序去重,开销大,可通过索引或业务逻辑避免重复数据。
  • 优化JOIN操作:JOIN是多表联合查询的核心,低效的JOIN会降低效率。

    • 小表驱动大表:JOIN时,用小数据量作为驱动*(左表)*,减少外层循环
    • 关联字段加索引,JOIN的关联字段(如s.id = b.sid中id和sid)必须建索引,否则会导致全表扫描+嵌套循环。
    • 减少Join表的数量:尽量控制表数量在3张以内。
  • 优化子查询:子查询(SELECT 中嵌套SELECT)可能产生临时表,效率较低,建议使用JOIN替代。

  • 优化排序和分组

    • 利用索引排序:若排序字段是索引的一部分,可避免额外排序(索引本身有序)。
      例:索引(age, name),查询SELECT * FROM user WHERE age > 18 ORDER BY age, name(直接用索引顺序,无需排序)。
    • 限制排序数据量:排序前通过WHERE过滤掉无关数据,减少排序行数。
      例:SELECT * FROM user WHERE age > 18 ORDER BY age LIMIT 10(仅排序符合条件的行,且只取前 10)。
    • GROUP BY优化:GROUP BY会先排序再分组,可通过ORDER BY NULL禁用排序(若无需分组后排序):
      SELECT age, COUNT(*) FROM user GROUP BY age ORDER BY NULL 。
  • 分页查询优化:大分页(如limit 100000,10)会扫描大量无用数据,

    • 基于主键分页:利用主键有序性,通过WHERE定位起始位置:
      优化前:SELECT * FROM order LIMIT 100000, 10(扫描 100010 行)
      优化后:SELECT * FROM order WHERE id > 100000 LIMIT 10(仅扫描 10 行,需id是主键)
    • 延迟关联:先查主键,再关联获取其他字段(减少扫描字段):
      SELECT o.* FROM order o JOIN (SELECT id FROM order LIMIT 100000, 10) t ON o.id = t.id
  • 避免频繁创建临时表
    以下操作可能触发临时表(内存或磁盘临时表,开销大):

    • GROUP BY、DISTINCT、UNION
    • 子查询结果作为临时表
      优化:尽量用JOIN替代子查询,避免不必要的GROUP BY,或通过tmp_table_size和max_heap_table_size限制内存临时表大小(超过则转磁盘)。
  • 用EXPLAIN分析执行计划
    EXPLAIN是 SQL 优化的 “利器”,通过它可查看 SQL 的执行方式(是否走索引、扫描行数等),重点关注:

    • type:访问类型(从差到好:ALL(全表扫描)→ index(索引扫描)→ range(范围扫描)→ ref(非唯一索引匹配)→ const(主键匹配))。
    • key:实际使用的索引(NULL表示未走索引)。
    • rows:预估扫描的行数(越小越好)。
    • Extra:额外信息(如Using filesort(需排序)、Using temporary(用临时表)、Using index(覆盖索引,无需回表))。

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

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

相关文章

利用Claude Code打造多语言网站内容翻译工具:出海应用开发全流程实战教程

一、工具选型与准备Claude Code 简介 Claude Code 是 Anthropic 公司推出的 AI 编程助手&#xff0c;可以辅助开发者生成代码、优化代码结构、进行代码解释等&#xff0c;支持多种主流编程语言。开发环境准备 Claude Code 账号或 API 接入权限Node.js 或 Python 环境&#xff0…

集成运算放大器(反向比例,同相比例)

基础知识&#xff1a;反相比例运算原理&#xff1a;示波器显示&#xff1a;结论&#xff1a;放大倍数为-R2/R1。R3的大小约等于R1与R2的并联电阻。由于放大器的最大输出电压取决于供电电压&#xff0c;所以如果R2为7k时&#xff0c;会导致失真。同向比例原理&#xff1a;示波器…

【HBase】HBaseJMX 接口监控信息实现钉钉告警

目录 一、JMX 简介 二、JMX监控信息钉钉告警实现 一、JMX 简介 官网&#xff1a;Apache HBase ™ Reference Guide JMX &#xff08;Java管理扩展&#xff09;提供了内置的工具&#xff0c;使您能够监视和管理Java VM。要启用远程系统的监视和管理&#xff0c;需要在启动Java…

SQL 语言规范与基础操作指南

SQL 语言规范与基础操作指南 SQL 作为数据库操作的核心语言&#xff0c;遵循规范的语法和书写习惯不仅能提高代码可读性&#xff0c;还能减少错误。本文整理了 SQL 的基础规则、书写规范及常用操作&#xff0c;适合初学者快速上手。 一、SQL 基本规则 1. 书写格式 SQL 语句可写…

产业园IBMS智能化集成系统功能有哪些?

产业园 IBMS&#xff08;建筑集成管理系统&#xff09;智能化集成系统是针对产业园 “多业态、多系统、多租户” 特点设计的全局管理平台&#xff0c;通过整合楼宇自控、安防、消防、能源、停车、租户服务等子系统&#xff0c;实现 “集中监控、协同联动、数据驱动、灵活服务”…

线性代数之两个宇宙文明关于距离的对话

矢量的客观性和主观性宇宙中飘过来一个自由矢量&#xff0c;全世界的人都可以看到&#xff0c;大家都在想&#xff0c;怎么描述它呢&#xff0c;总不能指着它说“那个矢量”吧。数学家很聪明&#xff0c;于是建立了一个坐标系&#xff0c;这个矢量投影到坐标系下&#xff0c;就…

Camx-Tuning参数加载流程分析

调用时序图 一、效果参数在开机时加载 CreateTuningDataManager逻辑分析 1.从xxx_module.xml获取sensor名称和效果参数名称&#xff0c; 比如效果参数名称为&#xff1a;xtc_tsp_sc520cs那么效果库的完整名称就是&#xff1a;com.qti.tuned.xtc_tsp_sc520cs.bin 2.优先从/data/…

《P4180 [BJWC2010] 严格次小生成树》

题目描述小 C 最近学了很多最小生成树的算法&#xff0c;Prim 算法、Kruskal 算法、消圈算法等等。正当小 C 洋洋得意之时&#xff0c;小 P 又来泼小 C 冷水了。小 P 说&#xff0c;让小 C 求出一个无向图的次小生成树&#xff0c;而且这个次小生成树还得是严格次小的&#xff…

Transformer浅说

rag系列文章目录 文章目录rag系列文章目录前言一、简介二、注意力机制三、架构优势四、模型加速总结前言 近两年大模型爆火&#xff0c;大模型的背后是transformer架构&#xff0c;transformer成为家喻户晓的词&#xff0c;人人都知道它&#xff0c;但是想要详细讲清楚&#x…

后台管理系统-3-vue3之左侧菜单栏和头部导航栏的静态搭建

文章目录1 CommonAside组件(静态搭建)1.1 Menu菜单1.2 准备菜单数据1.3 循环渲染菜单1.3.1 el-menu结构1.3.2 动态渲染图标1.4 样式设计1.5 整体代码(CommonAside.vue)2 CommonHeader组件(静态搭建)2.1 准备图片URL数据2.2 页面布局2.3 样式设计2.4 整体代码(CommonHeader.vue)…

VS Code配置MinGW64编译非线性优化库NLopt

VS Code用MinGW64编译C代码安装MSYS2软件并配置非线性优化库NLopt和测试引用库代码的完整具体步骤。 1. 安装MSYS2 下载安装程序&#xff1a; 访问 MSYS2官网下载 msys2-x86_64-xxxx.exe 并运行 完成安装&#xff1a; 默认安装路径&#xff1a;C:\msys64安装完成后&#xff0c…

C#通过TCP_IP与PLC通信

C#通过TCP/IP与PLC通信 本文将全面介绍如何使用C#通过TCP/IP协议与各种PLC进行通信&#xff0c;包括西门子、罗克韦尔、三菱等主流品牌PLC的连接方法。 一、PLC通信基础 PLC通信协议概览协议类型适用品牌特点Modbus TCP通用协议简单易用&#xff0c;广泛支持Siemens S7西门子PL…

Java 学习笔记(基础篇3)

1. 数组&#xff1a;① 静态初始化&#xff1a;(1) 格式&#xff1a;int[] arr {1, 2, 3};② 遍历/* 格式&#xff1a; 数组名.length */ for(int i 0; i < arr.length; i){//在循环的过程中&#xff0c;i依次表示数组中的每一个索引sout(arr[i]);//就可以把数组里面的每一…

知识点汇总linuxC高级-3 shell脚本编程

shell脚本编程shell ---> 解析器&#xff1a;sh csh ksh bashshell命令 ---> shell解析的命令shell脚本 --> shell命令的有序集合shell脚本编程&#xff1a;将shell命令结合按照一定逻辑集合到一起&#xff0c;写到一个 .sh 文件&#xff0c;去实现一个或多个功能&…

【C++学习篇】:基础

文章目录前言1. main() 函数2. 变量赋值3. cin和cout的一些细节4. 基本类型运算5. 内存占用6. 引用7. 常量前言 C 语法的学习整理&#xff0c;作为个人总结使用。 1. main() 函数 #include <iostream> //使用输入输出流库&#xff08;cin&#xff0c;cout&#xff09;…

使用nginx反向代理kkfile

这篇说一下我解决的思路和方式哈&#xff0c;不一定适用于大家&#xff0c;可以做个参考比如我们的系统服务是http://10.63.25.35:80&#xff0c;而我们的文件服务是在10.63.25.37:8012上&#xff0c;正常不使用代理的话&#xff0c;我们前端调用后端接口&#xff0c;后端调用k…

【低成本扩容】动态扩容实战指南

面对扩容操作时&#xff0c;下面这种操作是否也会迷惑你&#xff1f;下面来为大家解惑~size_t newcapacity 2*_capacity > (_size len)?2*_capacity:(_sizelen); //len为即将插入的字符串有效字符个数//_size为当前字符串有效字符个数//_capacity为当前容量大小//newcapa…

Product Hunt 每日热榜 | 2025-08-14

1. Autumn 标语&#xff1a;为AI初创公司简化的Stripe服务 介绍&#xff1a;Autumn帮助AI初创公司通过只需三个API调用来定价、计量和控制使用情况。基于Stripe搭建&#xff0c;它可以在一个地方管理订阅、使用情况和访问权限。无需复杂的webhooks或后端逻辑&#xff0c;非常…

Scrapy + Django爬虫可视化项目实战(二) 详细版

系列文章 Scrapy + Django爬虫可视化项目实战(一)_django scrapy-CSDN博客 实现技术 Scrapy Django Echarts 引言 可视化部分需要读者具备一定的Django基础!!! 上一个文章我们已经实现了爬取景点的数据,那么接下来就是根据爬取到的数据进行可视化 一、环境搭建 (一) 创…

选择式与生成式超启发算法总结

这里写目录标题Selection HHGeneration HHGPHH示例存在大量针对特定问题设计的启发式算法&#xff0c;近年来学术界提出了一个关键问题&#xff1a;如何选择最合适的启发式方法。这一问题推动了超启发式&#xff08;hyper-heuristic&#xff09;方法的研究发展。超启发式是一种…