IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Mysql 数据库从设计上的优化 -> 正文阅读

[游戏开发]Mysql 数据库从设计上的优化

一、字段类型的选择

1、尽量使用更小的数据类型

更小的数据类型通常更快,因为占用更少的磁盘、内存、和CPU 缓存,

1、整数类型

有TINYINT SMALLINT MEDIUMINT INT BIGINT 分别使用8 16 24 32 64 位的存储空间。

2、实数

FLOAT 和DOUBLE支持使用辨准的浮点运算进行近似运算,DECIMAL类型用于存储精确的小数,对于DECIMAL列,可以指定小数点前后所允许的最大位数,这会影响列的空间消耗,浮点类型再存储同样范围的值时,通常比DECIMAL使用更少的空间,

3、字符串类型

VARCHAR和CHAR是最主要的字符串类型。
VARCHAR用于存储可变长的字符串,比定长类型更节省空间,需要1-2个额外的字节记录字符串的长度,适用场景:

  • 字符串列的最大长度比平均长度大很多
  • 列的更新很少,
  • 使用了像UTF-8这样复杂的字符集,每个字符都适用不同的字节数进行存储
    CHAR类型是定长的:总是根据定义的字符串长度分配足够的空间,适用场景:
  • 存储很短的字符串
  • 非常适合存储密码的 md5值
  • 经常变更的数据
  • 存储单字节字符集

这里有几个问题可以思考:
a. varchar(>255) 与 text的选择?
text, 不占用记录空间。
一条记录, 有10个字段组成. 整个10个字段总空间有限(默认65535bytes), 当表中可能会出现大量的 大长度的字符串, 请使用text, 而不要使用varchar(>255)
b.我们倘若用VARCHAR(5)和VARCHAR(200)来存储’hello’,我们知道这两者的空间开销是一样的。那么我们可以让VARCHAR的长度始终保持很大吗?使用更短的列有什么优势吗?
事实证明有很大的优势。更长的列会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序或操作时会特别糟糕。在利用磁盘临时表进行排序时也同样糟糕。
c. varchar 与char的区别

  • 最大长度:char最大长度是255字符,varchar最大长度是65535个字节。
  • 定长:char是定长的,不足的部分用隐藏空格填充,varchar是不定长的。
  • 空间使用:char会浪费空间,varchar会更加节省空间。
  • 查找效率:char查找效率会很高,varchar查找效率会更低。
  • 尾部空格:char插入时可省略,vaechar插入时不会省略,查找时省略。

2、简单的数据类型的操作需要更少的CPU周期

1、比如整型字符操作代价更低,因为字符集和校对规则比整型更复杂。
例如, 存储 ipv4: 192.168.0.15,
语言中, 提供了: 整型与ip的转换:
mysql:inet_aton(): 地址到数值的转换, inet_ntoa()数值到地址的转换

3、尽量避免NULL

可为 null的列会使用更多的存储空间,当可为null的列被索引时,每个索引需要一个额外的字节

4、BLOB与TEXT的相同与区别

相同点

  • 都不允许有默认值。
  • 保存或检索数据不删除尾部空格。
  • 索引在blob或者text上必须执行索引前缀的长度。

不同点

  • text大小写不敏感,而blob排序和比较以大小写敏感的方式执行。
  • text是非二进制字符串,blob存储的是二进制数据。
  • text需要指定字符集,blob无需字符集校验。
  • blob可以储存图片, text只能储存纯文本文件。

5、使用枚举(enum)代替字符串类型

有时候可以使用枚举代替常用的字符串类型,枚举列可以把一些不重复的字符串存储成一个预定义的集合,MySQL在存储枚举时非常紧凑,会根据列表值的数量压缩到1个或2个字节中。MySQL在内部会将每个值在列表中的位置保存为整数,并且在.frm文件中保存“数字-字符串”映射关系的“查找表”。
但是枚举字段是按照内部存储的整数而不是定义的字符串进行排序的,而且字符串列表是固定的,添加或者删除字符串必须使用ALTER TABLE

6、日期和时间类型

timestamp存储的时间与时区有关,变换时区数据会受影响;datetime与时间无关;
timestamp存储时间范围小,1970-01-01 00:00:00到2038-01-19 03:14:07;datetime没有这个限制。
所以工作中要尽量用datetime。
Mysql提供了两种日期类型: DATETIME和TIMESTAMP。

2、范式

可以根据情况进行范式和反范式的设计。

3、索引

创建索引可以提高查询效率

4、分区、分表

1、分区

如果表中的数据量很大, 将表中的数据划分到各个数据区中存储, 降低每个区中存储的数据量。

2、分表

分为垂直分表和水平分表。水平分表是对一个表进行划分,垂直分表是根据业务划分的。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:46:08  更:2022-04-24 09:47:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 21:51:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码