提高mysql性能:设计阶段

news2024/9/21 20:45:33

合适的表设计

基本原则

避免太多的列

太多的列会导致mysql从行缓存中将编码过的列转换为行数据时花费大量大代价。

减少太多的关联

为减少太多的关联造成解析和查询的性能影响,应该将单表的关联控制在12个之内。

合理使用枚举

枚举只适用于值相对固定,且同时只有一个值的情况,修改枚举值会造成Alter table,阻塞用户操作

谨慎地使用NULL

NULL应尽量减少使用,使用时需要在减少性能影响、降低业务数据复杂度中做权衡选择

合理选择范式和反范式

范式

减少数据冗余,合理化数据结构的标准(数据库设计三大范式_2b勿扰的博客-CSDN博客_数据库设计三大范式)

优点

  1. 数据分散到不同表:需要更新的表更少
  2. 减少重复数据:查询时减少Distinct和Group by,修改时减少更新数据量

缺点

  1. 增加表关联,造成部分索引失效、查询性能降低低

反范式

适当增加数据冗余,提高查询效率

优点

  1. 提高数据查询性能

缺点

  1. 增加修改操作的难度
  2. 实现实时查询较为困难

取舍应用

  • 增加冗余列,减少关联

为主表增加从表的列,更新时同步更新多个表的相同列。

  • 缓存表和汇总表

汇总表:增加新表,保存实时统计需要的聚合值,以增加实时统计效率,更新数据时重新或者异步统计,查询时实时聚合处理结果。

例如:一个报表需要查询每个商品的指定时间段的销售金额、销售数量、退货金额、退货数量、毛利润、移动平均价等等统计,实时统计时带来大量的性能浪费,解决办法为创建汇总表,异步定时统计各项数据放置到新表,查询时如果要求实时,则需要根据时间重新聚合整理实时汇总数据和汇总表的数据,否则直接返回汇总表数据。

缓存表:增加新表保存来自多个表的字段,通常为快速响应业务需求,避免关联多个表的内容。

例如:一个报表需要查询展示订单的退款金额、欠款金额、还款金额、以及各种活动优惠金额,各种支付方式的付款金额时,数据分散到不同的表,为减少表关联,增加查询速度可以将这些字段单独提升到一张新表

  • 物化视图

使用FlexViews实现物化视图,(生成新物理表,通过Binlog更新数据)

  • 计数器表

类似汇总表,用于统计业务需要的数量,不同的是,计数器表为了避免事务造成锁问题,可以使用多行数据进行统计,不同线程更新时,将随机行的数据加1,查询时对所有行进行sum汇总。

合适的字段设计

基本原则

  • 尽量极少数据大小

        可以减少存储、内存占用,增加数据查询速度

  • 优先选择基础数据类型

        基础数据类型可以减少CPU占用

  • 尽量减少NULL

        NULL值会造成索引统计和值比较困难、增加空间占用

整数类型

TINYINT:8位

SMALLINT:16位

MIDIUMINT:24位

INT:32位

BIGING:64位

数据范围:2^{n}~2^{n} (n为位数)

  • unsigned:无符号,可以将整数范围翻一倍
  • 有符号和无符号性能和空间占用相同
  • 整数的宽度对存储无效,仅为了数据展示工具显示字符个数

实数类型

double:4个字节

float:8个字节

decimal:16个字节

DECIMAL(20,2) 指的就是总共能存20位数字,末尾2位是小数(小数点不算在长度内)

  • decimal 计算方式为mysql实现,非CPU支持,故计算速度较差
  • 浮点类型比decimal占用空间更小。
  • 精确计算时使用decimal,否则可以使用money或者BIGINT(右移小数点)来保存货币数据

字符串类型

varchar:最大占用空间65535(max row size),实际占用空间为:实际设定长度+1-2位长度值,varchar指定的为字符个数,非字节

char:最大占用空间255(32个字节),实际占用空间为指定字符个数,指定宽度,指的同为字符数。

char占用空间位指定长度,不够则使用空格填充,所有存储时会删除末尾空格。

1.char适用情况

  •   长度固定或变化较小的字符串
  • 需要频繁变更的数据,不会产生碎片
  • 占用空间较小的情况(不需要特定数据长度位)

2. varchar适用情况:

  • 数据最大长度大于平均长度较多
  • 列更新较少,碎片较少
  • 使用UTF字符集保存,每个字符占用的字节数不同
  • varchar过长应该使用Blog类型

Blob和Text类型

Text类型为了保存文本数据

tinytext:最大长度255个字节

text:最大长度64K

mediumtext:最大长度16M

longtext:4GB

blob类型为保存二进制数据

tinyblob:最大长度255个字节

blob:最大长度64K

mediumblob:最大长度16M

longblob:4GB

  •  blob和text数据在存储时仅保存1-4个字节的指针,指向外部存储的数据。
  • blob保存为二进制数据,没有配需规则与字符集
  • 排序时仅对系统中指定的max_sort_length的字节配需。如需指定长度,使用order by substring(column,length)
  • 尽量避免使用,如无法避免,尽量单独的表来保存,避免查询时直接发生关系

枚举类型

enum:实质存储时为整数,长度为4个字节

  • 存储值从1开始,NULL表示没有属性值,0为空字符串。。
  • 保存时,如果sqlmode为严格模式,会直接报错,无法保存,否则保存成功,而数据为空字符串。
  • 由于规则比较特殊在实际使用时,应该避免使用,使用tinyint来实现

日期时间类型

datetime:占用8个字节,时间范围0000-9999年

timastamp:占用4个字节,从1970年1月1日午夜到目前的毫秒数,时间范围只能从1970-2038

  • timestamp类型不允许为空默认为服务器当前时间,且包含失去信息
  • 如果需要保存精度更小的时间值。需要自定义longint来保存纳秒、微妙数据,或者double来存储为小数

位数据类型

bit:最大长度为64位

set:64个成员或者4个字节

  • bit类型mysql存储时会保存为二进制字符串。
  • bit类型在检索时会将数据转换为二进制字符串,在数字环境会返回对应二进制的ASCII码

如:‘00111001’ (十进制为57)存储为Bit(8)列a中:

select a,a+0 from XX
a=9,a+0=57
  • 尽量避免使用bit,表达bool类型时使用Char(0),存储null或者空字符串,或者tinyint(1),1或则0
  • 尽量避免使用set,可以使用tinyint来存储,如:tinyint(8)来存储8个数据位

处理特殊类型数据

IP地址应该用32位无符号数保存,mysql提供了INET_ATON()和INET_NTOA()对数据进行转换

合适的标识符设计

整数类型

  • 满足条件下尽量选择最小的数据格式(横向分表的情况可以使用TINYINT)
  • 优先使用整数类型,速度更快,可以发挥自增长的优势

字符串类型

  • 尽量避免使用字符串,占用空间更大,速度更慢,排序困难
  • UUID应该去除‘-’或者使用nanoID.
  • UUID使用应该使用char(16)定长格式

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

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

相关文章

go入门——基础语法

go环境安装 1、安装 go官网:Downloads - The Go Programming Language (google.cn) go中文网:Go下载 - Go语言中文网 - Golang中文社区 (studygolang.com) 这里我是amd64位win10系统,所以我下载这个 下载完成之后安装到自己喜欢的目录就好…

Java:基于XML的Spring使用【IOC容器】

基于XML的Spring使用一、Spring IOC 底层实现1.1 BeanFactory与ApplicationContexet1.2 图解IOC类的结构二、 Spring依赖注入数值问题【重点】2.1 字面量数值2.2 CDATA区2.3 外部已声明bean及级联属性赋值2.4 内部bean2.5 集合三、 Spring依赖注入方式【基于XML】3.1 set注入3.…

电子技术——MOS管的CV特性

电子技术——MOS管的CV特性 MOS管是一种压控晶体管,本节我们学习MOS管的CV特性,即电压-电流特性。MOS管的特性曲线有两种,分别是伏安特性和传导特性。 iD−vDSi_D-v_{DS}iD​−vDS​ 特性曲线 为了测量MOS管的 iD−vDSi_D-v_{DS}iD​−vDS​…

ctfshow黑盒测试篇

文章目录web380web381web382web383web384web385web386web387web388web389web390web391web392web393web394、395web380 目录扫出来了page.php $id应该是传的参数,是php的文件名 page.php?idflag 访问源码拿到flag web381 就是这个目录 /alsckdfy/ 访问就是flag …

力扣(LeetCode)1664. 生成平衡数组的方案数(C++/Python3)

题目描述 模拟 逆向思维(删除元素的性质):删除数组的某个元素,左侧元素的下标不变,右侧元素的下标发生奇偶替换。 算法流程 ① 由于算法从右往左枚举,预处理左侧的奇数下标元素之和oddl,偶数下…

过万春节服务全是问题无语了-Harbor镜像仓库访问404

1、背景 春节后的周六补班,累啊,到公司发现docker和kubelet服务都被停止了,可能是春节期间担心发生安全隐患吧,服务启动后发现很多镜像无法拉取了 到相关的节点上去尝试拉取镜像发现报了404错误 docker pull xxx.xxx.xxx.xxx/d…

初学者如何学好Java数组,不妨点进来看看,赶在新年前肝完的万字博客

新年好~~~新年开篇万字博客 —Java数组的学习,有点干货,建议收藏观看!!! 本篇介绍了数组的概念,数组创建和初始化.数组的使用(元素访问,和数组遍历方法),初识引用数据类型,简单介绍JVM内存分布,认识null,堆区空间的释放 二维数组相关知识的介绍~ 学习Java中的数组一.数组的基本…

变增益PID(含5种变增益模式PLC源代码+Simulink仿真)

变增益PID的详细理论讲解和应用场景,请参看下面的文章链接: 增益自适应PI控制器+死区过滤器(Smart PLC向导PID编程应用)_RXXW_Dor的博客-CSDN博客增益自适应和死区过滤器如果不和S7-200 SMART PLC PID向导组合实现,大家可以自行编写优化的PID指令。算法起始非常简单,具体…

2 分钟就能抓取任何网站的数据是怎么做到的?? #Browse AI

尽管现在使用网络的方式或多或少与 20 年前相同,但网络在我们生活中占据的地位越来越重要,网站却变得越来越繁琐。最重要的是,即使网络上有大量有价值的实时数据,收集它们也是非常昂贵和耗时的。Browse AI 是一款可以从任何网站提…

untiy TextMeshPro(简称TMP)组件详细内容

首先unity官方API对该组件的描述是: TextMeshPro 是 Unity 的最终文本解决方案。它是 Unity UI Text 和旧版 Text Mesh 的完美替代方案。 功能强大且易于使用的 TextMeshPro(也称为 TMP)使用高级文本渲染技巧以及一组自定义着色器&#xff1b…

Numpy(4)—Numpy 数组操作(修改数组形状、翻转数组、修改数组维度、连接数组、分割数组、数组元素的添加与删除

Numpy 数组操作 (1)修改数组形状 import numpy as npa np.arange(8) print (原始数组:) print (a) print (\n)b a.reshape(4,2) print (修改后的数组:) print (b)1)numpy.ndarray.flat import numpy as npa np.a…

【ARM体系结构】之寄存器与三级流水线

1、ARM核的寄存器组织 1.1 寄存器概念介绍 控制器:控制程序运行,进行取指令操作,并将指令给到对应的运算器执行指令。 运算器:执行汇编指令,执行指令需要的使用的数据来源于寄存器,并将执行的执行结果返回…

如何在服务器上安装相应的依赖和包

我感觉这一篇的逻辑写的比较奇怪,于是想重写一篇。 python setup.py install报错“error: can‘t create or remove files in install directory”_ACMSunny的博客-CSDN博客 开始遇到的问题是要跑的程序数据太大,咱们通常会将本机上的Python程序和数据…

MIT6.830-2022-lab6实验思路详细讲解

系列目录 lab1 地址 : lab1 lab2 地址 :lab2 lab3 地址 :lab3 lab4 地址 :lab4 lab5 地址 :lab5 lab6 地址 :lab6 文章目录系列目录一、实验概述SimpleDB日志格式steal/force策略:二、实验正文Exercise 1 - rollbackExercise 2 - Recovery总结一、实验概述 In this lab y…

【SAP Fiori】X档案:Node.js 与 SAPUI5 开发环境的安装与配置

Node.js 与 SAPUI5 开发环境的安装与配置一、安装Node.js1、下载2、安装3、配置环境变量4、验证5、更改路径6、更改镜像源二、安装 Vue.js1、安装Vue2、查看版本三、安装webpack1、安装webpack2、安装webpack-cli3、验证是否安装成功四、新建Vue项目1、创建项目2、启动项目五、…

使用NoneBot2可视化平台搭建QQ聊天机器人:本地和云部署教程

NoneBot是一个基于Python 3.8的异步、开源和可扩展的框架,用于构建和运行聊天机器人,支持各种聊天平台,如Telegram,Discord和WeChat。它是基于nonebot库构建的,提供了一个易于使用的界面,用于创建聊天机器人…

Python爬虫之Scrapy框架系列(7)——XXTop250电影简介信息的获取及存储到本地

前面简单爬取了某Top250电影的一些信息。本文,来尝试搞到每个电影的简介信息。 目录:1. 获取电影简介信息1.1 第一步:配对每个电影对应的简介信息:First:包含电影简介信息url的获取Second:爬虫文件的更改Th…

Java和Scala中关键字package指定的是源文件的存放路径吗?

无为也,则用天下而有余;有为也,则为天下用而不足🔬 目录 Scala代码演示 Java代码演示 总结 写在前面: 包(package)不是约定源文件存放的位置,而是约定源文件编译后生成的字节码…

数据挖掘,计算机网络、操作系统刷题笔记37

数据挖掘,计算机网络、操作系统刷题笔记37 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,orac…

Scanpy 单细胞测序基因分析

参考:https://www.bilibili.com/video/BV1sq4y1C7Qx/ https://scanpy-tutorials.readthedocs.io/en/latest/pbmc3k.html 代码下载:scanpy分析scRNA-seq数据基本流程(含scanpy seurat两大工具对比) 链接: https://pan.baidu.com/s…