MySQL 结构的优化方案

主要是指三方面,即表结构、字段结构以及索引结构,这些结构如果不合理,在某些场景下也会影响数据库的性能,因此优化时也可以从结构层面出发。一般在项目的库表设计之初就要考虑,当性能瓶颈出现时再调整结构,就为时过晚。

1. 表结构的优化

表结构设计时字段数量一定不要太多,InnoDB引擎基本上都会将数据操作放到内存中完成,一张表的字段数量越多,能载入内存的数据页会越少,当操作时数据不在内存,又不得不去磁盘中读取数据,这显然会很大程度上影响MySQL性能。

表结构的设计,正常情况下应当遵循《数据库三范式》的原则设计,尽可能的根据业务将表结构拆分的更为精细化,一方面确保内存中缓存的数据更多,更便于维护,而且执行SQL时,效率也会越高。

主键选择要合适,一张表中必须要有主键且最好是顺序递增的。一张表如果业务中自带自增属性字段,最好选择这些字段作为主键。没有可以设计一个与业务无关、无意义的数值序列。

对实时性要求不高的数据建立中间表。很多时候为了统计一些数据时,都会基于多表做联查,以此来确保得到统计所需的数据,对于实时性的要求不高,可以在库中建立相应的中间表,然后每日定期更新中间表的数据,从而减小联表查询的开销,同时也能进一步提升查询速度。

根据业务特性为不同的表选择合适的存储引擎,主要在InnoDB、MyISAM之间做选择。经常查询,很少发生变更的表可以选择MyISAM引擎。其他表可以使用默认的InnoDB引擎。

2. 字段结构的优化

设计表时选择合适的数据类型

  • 姓名字段,一般都会限制用户名长度,不要无脑用varchar,使用char类型更好。
  • 一些显然不会拥有太多数据的表,主键ID的类型可以从int换成tinyint、smallint、mediumit。
  • 日期字段,不要使用字符串类型,更应该选择datetime、timestamp,一般情况下最好为后者。
  • 一些固定值的字段,如性别、状态、省份、国籍等字段,可以选择使用数值型代替字符串,如果必须使用字符串类型,最好使用enum枚举类型代替varchar类型。

总之保持三个原则

  1. 足够的使用范围内选择最小的数据类型,它们占用更少的磁盘、内存、和CPU缓存,处理速度也会更快
  2. 避免索引字段值为NULL,字段空值过多会影响索引性能
  3. 尽量使用简单的类型代替复杂的类型,如IP的存储可以使用int而并非varchar,因为简单的数据类型,操作时通常需要的CPU资源更少。

3. 索引结构的优化

根据业务创建更合适的索引,主要从4个方面考虑:

  1. 一个表需要建立多个索引,适当根据业务将多个单列索引组合成一个联合索引,可以节省磁盘空间,能够充分使用索引覆盖的方式查询数据,一定程度上提升数据库的整体性能。
  2. 值较长的字段尽量建立前缀索引,索引字段值越小,单个B+Tree的节点中能存储的索引键会越多,索引树会越矮,查询性能自然越高。
  3. 经常做模糊查询的字段,可以建立全文索引代替普通索引,基于普通索引做like查询会导致索引失效,而采用全文索引的方式做模糊查询效率会更高更快,并且全文索引的功能更为强大。
  4. 索引结构的选择根据业务进行调整,在某些不做范围查询的字段上建立索引时,可以选用hash结构代替B+Tree结构,Hash结构的索引是所有数据结构中最快的,散列度足够的情况下,复杂度仅为O(1)。

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

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

相关文章

Python函数语法详解(与C++对比学习)【未完】

一、Python函数的形式 def function_name (参数, ...) -> return value_type:# 函数体return value# 看具体需求# 如果没有return语句,函数执行完毕后也会返回结果# 只是结果为None。return None可以简写为return 1. Python的返回值 在Python3中,提…

利用Redis bitmap 实现签到案例

数据库实现 设计签到功能对应的数据库表 CREATE TABLE sign_record (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,user_id bigint NOT NULL COMMENT 用户id,year year NOT NULL COMMENT 签到年份,month tinyint NOT NULL COMMENT 签到月份,date date NOT NULL COMMENT 签…

EI检索被认为是工程技术领域的权威数据库

EI检索被认为是工程技术领域的权威数据库,能够被EI检索收录的期刊和会议论文通常被认为具有一定的学术质量和影响力。然而,EI检索与“高水平”不能完全画等号,以下是一些需要考虑的因素: 1. 收录标准:虽然EI检索有严格…

在Linux操作系统中关于逻辑卷的案例

1.如何去创建一个逻辑卷 1.1先去创建物理卷 如上图所示,physical volume 物理卷 被成功创建。 如上图所示,可以使用pvscan来去查看当前Linux操作系统的物理卷/ 1.2使用创建好的物理卷去创建一个卷组。 如上图所示,可以使用第一步创建的两个…

【中项第三版】系统集成项目管理工程师 | 第 9 章 项目管理概论③ | 9.6 - 9.10

前言 第 9 章对应的内容选择题和案例分析都会进行考查,这一章节理论性较强,学习要以教材为准。本章分值预计在4-5分。 目录 9.6 项目管理过程组 9.7 项目管理原则 9.8 项目管理知识领域 9.9 价值交付系统 9.10 本章练习 9.6 项目管理过程组 项目…

千万不能踏入的渠道管理五大误区!【附策略】

一、引言 在当今激烈的市场竞争环境中,有效的渠道管理是企业获得竞争优势的关键。然而,在实践过程中,不少企业因陷入管理误区而影响了市场拓展和品牌建设。本文旨在揭示渠道管理中常见的五大误区,并提供避免策略,帮助…

高级Redis之Stream的用法示例

不想自己搭建一个mq怎么办?Redis的Stream 来帮你,Redis Stream 是 Redis 5.0 引入的一种新的数据结构,用于处理实时的、可持久化的、基于时间序列的数据流。它非常适合处理事件流、日志、消息队列等场景。下面是一个使用 Redis Stream 的具体…

web基础与HTTP协议(企业网站架构部署与优化)

补充:http服务首页文件在/var/www/html下的,一定是index.html命名的文件。才会显示出来。 如果该路径下没有相应的文件,会显示/usr/share/httpd/noindex下的index.html文件。 如果/usr/share/httpd/noindex没有index.html文件,会…

BSI 第七届万物互联智慧高峰论坛:主题:拥抱AI时代,标准赋能组织实现可持续发展

BSI 第七届万物互联智慧高峰论坛:主题:拥抱AI时代,标准赋能组织实现可持续发展 主要收到 BSI 温女士的邀请参加的本次论坛。还是学到的很多 。 在科技日新月异的时代背景下,BSI 第七届万物互联智慧高峰论坛于[时间:6…

Object 类中的公共方法详解

Object 类中的公共方法详解 1、clone() 方法2、equals(Object obj) 方法3、hashCode() 方法4、getClass() 方法5、wait() 方法6、notify() 和 notifyAll() 方法 💖The Begin💖点点关注,收藏不迷路💖 在 Java 中,Object…

AI 驱动的数据中心变革与前景

文章主要探讨了AI计算时代数据中心的转型,涉及计算技术的多样性、规格尺寸和加速器的发展、大型语言模型(LLM)的发展、功耗和冷却趋势、基准测试的重要性以及数据中心的发展等方面。为大家提供深入了解AI基础设施发展的视角。 计算技术的多样…

Ubuntu(通用)—网络加固—ufw+防DNS污染+ARP绑定

1. ufw sudo ufw default deny incoming sudo ufw deny in from any to any # sudo ufw allow from any to any port 5353 protocol udp sudo ufw enable # 启动开机自启 # sudo ufw reload 更改后的操作2. 防ARP欺骗 华为云教程 arp -d删除dns记录arp -a显示arp表 ipconfi…

PTrade常见问题系列3

量化允许同时运行回测和交易的策略个数配置。 量化允许同时运行回测和交易的策略个数在哪里查看? 在量化服务器/home/fly/config/custom_config_conf文件中,其中运行回测的策略个数由backtest_switch(是否限制普通回测个数)及ba…

Qt 日志输出的选择方案有多少

Qt 日志输出的选择方案主要包括以下几种: 使用内置的日志函数: qDebug():用于输出调试信息。qInfo():用于输出一般信息。qWarning():用于输出警告信息。qCritical():用于输出关键错误信息,表明…

详细设计与概要设计区别-慧哥充电桩开源系统

概要设计更侧重于系统的整体构架和模块划分,而详细设计则关注具体模块的实现细节。在软件开发过程中,这两个阶段虽然紧密相关,但它们各自有着不同的目标和方法。以下是具体分析: 目标 概要设计:概要设计关注系统整体架…

matlab 绘制高等数学中的二维函数示例

matlab 绘制高等数学中的二维函数示例 绘制高等数学中的二维函数示例绘制结果 绘制高等数学中的二维函数示例 clc,clear,close all; % 定义方程 eqn (x, y) (x.^2 y.^2).^3 - y.^4;% 绘制方程曲线和坐标轴 ezplot(eqn, [-2, 2, -2, 2]) hold on % 在同一图形中保持绘图% 绘…

S7-1200PLC学习记录

文章目录 前言一、S7-12001.数字量输入模块2. PNP接法和NPN接法 二、博图软件1. 位逻辑运算Part1. 添加新设备(添加PLC)Part2. 添加信号模块Part3. 添加信号板中模块Part4. 添加新块Part5. Main编程文件案例1案例2 -( S )- 和 -( R )-完整操作过程&#…

昇思25天学习打卡营第8天|ResNet50迁移学习

一、迁移学习定义 迁移学习(Transfer Learning):在一个任务上训练得到的模型包含的知识可以部分或全部地转移到另一个任务上。允许模型将从一个任务中学到的知识应用到另一个相关的任务中。适用于数据稀缺的情况,可减少对大量标记…

掌握Linux网络:深入理解TC —— 你的流量控制利器

目录 简单概述: qdisc(队列): 举例: Bash 整形队列算法: FIFO (First-In-First-Out) PFIFO (Priority FIFO) SFQ (Stochastic Fair Queuing) RED (Random Early Detection) HTB (Hierarchical Token Bucket) TBF…

谷粒商城笔记-04-项目微服务架构图简介

文章目录 一,网络二,网关1,网关选型2,认证鉴权3,动态路由4,限流5,负载均衡6,熔断降级 三,微服务四,存储层五,服务治理六,日志系统七&a…