MySQL(二)

news2024/10/6 22:25:46

schema与数据类型优化

数据类型的优化

  1. 更小的通常更好
    应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少,但是要确保没有低估需要存储的值的范围,如果无法确认哪个数据类型,就选择你认为不会超过范围的最小类型
    案例:
    设计两张表,设计不同的数据类型,查看表的容量
  2. 简单就好
    简单数据类型的操作通常需要更少的CPU周期,例如,
    1、整型比字符操作代价更低,因为字符集和校对规则是字符比较比整型比较更复杂,
    2、使用mysql自建类型而不是字符串来存储日期和时间
    3、用整型存储IP地址
    案例:
    创建两张相同的表,改变日期的数据类型,查看SQL语句执行的速度
  3. 尽量避免null
    如果查询中包含可为NULL的列,对mysql来说很难优化,因为可为null的列使得索引、索引统计和值比较都更加复杂,坦白来说,通常情况下null的列改为not null带来的性能提升比较小,所有没有必要将所有的表的schema进行修改,但是应该尽量避免设计成可为null的列
  4. 实际细则
    • 整数类型
      可以使用的几种整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分别使用8,16,24,32,64位存储空间。
      尽量使用满足需求的最小数据类型

    • 字符和字符串类型
      1、char长度固定,即每条数据占用等长字节空间;最大长度是255个字符,适合用在身份证号、手机号等定长字符串
      2、varchar可变程度,可以设置最大长度;最大空间是65535个字节,适合用在长度可变的属性
      3、text不设置长度,当不知道属性的最大长度时,适合用text
      按照查询速度:char>varchar>text

      • varchar根据实际内容长度保存数据
        • 1、使用最小的符合需求的长度。
        • 2、varchar(n) n小于等于255使用额外一个字节保存长度,n>255使用额外两个字节保存长度。
        • 3、varchar(5)与varchar(255)保存同样的内容,硬盘存储空间相同,但内存空间占用不同,是指定的大小 。
        • 4、varchar在mysql5.6之前变更长度,或者从255一下变更到255以上时时,都会导致锁表。
        • 应用场景
          • 1、存储长度波动较大的数据,如:文章,有的会很短有的会很长
          • 2、字符串很少更新的场景,每次更新后都会重算并使用额外存储空间保存长度
          • 3、适合保存多字节字符,如:汉字,特殊字符等
      • char固定长度的字符串
        • 1、最大长度:255
        • 2、会自动删除末尾的空格
        • 3、检索效率、写效率 会比varchar高,以空间换时间
        • 应用场景
          • 1、存储长度波动不大的数据,如:md5摘要
          • 2、存储短字符串、经常更新的字符串
    • BLOB和TEXT类型
      MySQL 把每个 BLOB 和 TEXT 值当作一个独立的对象处理。
      两者都是为了存储很大数据而设计的字符串类型,分别采用二进制和字符方式存储。

    • datetime和timestamp
      1、不要使用字符串类型来存储日期时间数据
      2、日期时间类型通常比字符串占用的存储空间小
      3、日期时间类型在进行查找过滤时可以利用日期来进行比对
      4、日期时间类型还有着丰富的处理函数,可以方便的对时间类型进行日期计算
      5、使用int存储日期时间不如使用timestamp类型
      - datetime
      - 占用8个字节
      - 与时区无关,数据库底层时区配置,对datetime无效
      - 可保存到毫秒
      - 可保存时间范围大
      - 不要使用字符串存储日期类型,占用空间大,损失日期类型函数的便捷性
      - timestamp
      - 占用4个字节
      - 时间范围:1970-01-01到2038-01-19
      - 精确到秒
      - 采用整形存储
      - 依赖数据库设置的时区
      - 自动更新timestamp列的值
      - date
      - 占用的字节数比使用字符串、datetime、int存储要少,使用date类型只需要3个字节
      - 使用date类型还可以利用日期时间函数进行日期之间的计算
      - date类型用于保存1000-01-01到9999-12-31之间的日期

    • 使用枚举代替字符串类型
      有时可以使用枚举类代替常用的字符串类型,mysql存储枚举类型会非常紧凑,会根据列表值的数据压缩到一个或两个字节中,mysql在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的查找表
      create table enum_test(e enum(‘fish’,‘apple’,‘dog’) not null);
      insert into enum_test(e) values(‘fish’),(‘dog’),(‘apple’);
      select e+0 from enum_test;

    • 特殊类型数据
      人们经常使用varchar(15)来存储ip地址,然而,它的本质是32位无符号整数不是字符串,可以使用INET_ATON()和INET_NTOA函数在这两种表示方法之间转换
      案例:
      select inet_aton(‘1.1.1.1’)
      select inet_ntoa(16843009)

合理使用范式和反范式

  1. 范式
    • 第一范式(1NF):原子性(存储的数据应该具有“不可再分性”)
      第二范式(2NF):唯一性 (消除非主键部分依赖联合主键中的部分字段)(一定要在第一范式已经满足的情况下)
      第三范式(3NF):独立性,消除传递依赖(非主键值不依赖于另一个非主键值)
    • 优点
      • 范式化的更新通常比反范式要快
      • 当数据较好的范式化后,很少或者没有重复的数据
      • 范式化的数据比较小,可以放在内存中,操作比较快
    • 缺点 通常需要进行关联
  2. 反范式
    • 优点
      • 所有的数据都在同一张表中,可以避免关联
      • 可以设计有效的索引;
    • 缺点 表格内的冗余较多,删除数据时候会造成表有些有用的信息丢失
  3. 注意
    • 在企业中很好能做到严格意义上的范式或者反范式,一般需要混合使用
      • 在一个网站实例中,这个网站,允许用户发送消息,并且一些用户是付费用户。现在想查看付费用户最近的10条信息。 在user表和message表中都存储用户类型(account_type)而不用完全的反范式化。这避免了完全反范式化的插入和删除问题,因为即使没有消息的时候也绝不会丢失用户的信息。这样也不会把user_message表搞得太大,有利于高效地获取数据。
      • 另一个从父表冗余一些数据到子表的理由是排序的需要。
      • 缓存衍生值也是有用的。如果需要显示每个用户发了多少消息(类似论坛的),可以每次执行一个昂贵的自查询来计算并显示它;也可以在user表中建一个num_messages列,每当用户发新消息时更新这个值。
    • 案例
      范式设计在这里插入图片描述
      反范式设计
      在这里插入图片描述

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

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

相关文章

项目管理:产品新人常犯的四个错误

作为产品经理,在刚进入职场的时候总会遇到各种各样的困难,产品小白常犯的错误: 1、拿到需求就开始写方案 很多新人在接到一个需求时,常常犯的错误就是直接开始写产品需求文档。很多时候我们的需求来自于老板或者甲方,…

LeetCode-350. 两个数组的交集 II

目录方法一:哈希表方法二:排序 双指针题目来源 350. 两个数组的交集 II 方法一:哈希表 由于同一个数字在两个数组中都可能出现多次,因此需要用哈希表存储每个数字出现的次数。对于一个数字,其在交集中出现的次数等于…

看板:自我管理的高效工具!

当在团队中在做看板管理的时候,我们一直强调的是看板中的工作项需要承载价值。通过拉动承载价值的工作项在看板中的流动,我们可以清晰地看到产品价值从需求端流动到交付端的进展及状态。也正因如此,我们需要及时识别看板中没有价值的工作项并…

解锁极狐GitLab 自动化功能:Webhook 触发 Pipeline 与计划流水线

本文来自: 杨洪丽 极狐GitLab 高级网站可靠性工程师(SRE) 只使用极狐GitLab 存放代码? 那你就 OUT 啦! 如果你也遇到了如图 A / B / C / D 各位同学的烦恼,不要错过这篇能够让你日常工作更高效的内容。 使用极狐GitLab Webhook 触发 Pipelin…

JSON格式店铺商品列表api

对于做竟店分析来说,首先要知道店铺有哪些商品,店铺宝贝列表则提供了这样的入口,可以查看该店铺的所有宝贝,也可以通过关键词全局搜索来获取店铺宝贝,但搜索会夹带这很多推荐的结果在里面,会比较混乱。 淘宝…

Python语言零基础入门教程(二)

Python 变量类型 变量是存储在内存中的值,这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。 因此,变量可以指定不同的数据类型,这些变…

2023年不良资产项目尽调研究报告

第一章 不良资产的尽调方法 1.1 档案查阅 阅档是尽职调查工作的第一步也是最基础的环节。阅档过程是对资产进行了解的过程,阅档需要判断债权是否具有瑕疵,担保是否继续有效,初步了解各类资产所含的法律关系、状态、权益等。 通过查阅项目卷…

AI人工智能方向

AI人工智能方向 图像CV 图像处理,犬类识别,场景文字识别,人脸算法,图像增强,计算机影像,车型识别,物体检测,黄色图片识别,目标检测API文档Logo检测使用手册&#xff0c…

【数字孪生百科】每周认识一个数字孪生要素 —— 气泡图(Bubble Chart)

简介气泡图(Bubble Chart)是一种多变量的图片,是散点图的一种变体,气泡图其实是在散点图的基础上进行升级改造的,在原有的以横纵坐标为变量的基础上,引入第三个变量,用气泡的大小来表示&#xf…

Lesson 5. 分类模型决策边界与模型评估指标(上)

文章目录一、决策边界(Decision Boundary)基本概念与用途1. 决策边界基本概念与绘制方法2. 通过决策边界观察模型性能3. 逻辑回归决策边界与模型可解释性二、逻辑回归决策边界绘制与使用方法1. 定义决策边界绘制函数2. 决策边界绘制3. 逻辑回归决策边界与…

3、Maven——Maven创建java web工程,IDEA更改XML版本、Maven Search插件的安装与使用

目录 一、Maven创建java web工程 二、Maven创建java web项目的结构 1、添加项目目录 2、web.xml配置处理报错 三、IDEA更改XML版本 四、Maven Search插件的安装与使用 1、Maven Search的安装 2、Maven Search的使用 一、Maven创建java web工程 创建Empty Project空工程…

【U8+】用友U8试算UFO报表后,显示#公式错误;并且函数向导中没有用友账务函数。

【问题描述】 使用用友U816.1软件的时候, 打开UFO报表,计算资产负债表后,显示【#公式错误】。 【排查过程】 开始以为是选择的报表模板文件有问题,将其文件发送到其他U8客户端电脑上,操作正常。 那么可以认为报表模板…

java vector 类

目录 一.前言 1.1vector简介 1.1.1java Collection下的子类图 1.1..2 介绍 1.1.3Vector类详细规则 1.2Vector与ArrayList的区别 二.Vector的方法 三.代码示例(demo) 一.前言 1.1vector简介 1.1.1java Collection下的子类图 1.1..2 介绍 Vector类 是在 java 中可以实现…

从0到1一步一步玩转openEuler--02 openEuler操作系统的安装

2 openEuler操作系统的安装 2.1 openEuler操作系统的安装流程 2.2 openEuler操作系统的安装详细步骤 本次介绍 openEuler 22.03-LTS 基于 X86 架构的安装。 2.2.1 下载地址 官网下载地址:https://www.openeuler.org/zh/download/ 根据你的实际需求选择适合架构…

提取游戏《碧蓝档案》(Blue Archive)内的素材

实际上你游素材直接去根目录下找就行,唯一需要处理的可能就是bgm(格式均为ogg),用格式工厂或者你下个VLC都行。 使用方法:一根usb数据线,一台电脑,一部手机 目录 游戏目录位置 附录 更新&a…

SpringBean生命周期

IOC 控制反转 既然叫反转,肯定就有正转,正转其实就是对象去找实例,而反转就反过来了嘛,让实例来找对象通过容器; DI 依赖注入 通过容器注入了bean对象,而且这个过程是自动化的,也就是说容器…

计算机视觉

什么是计算机视觉? 计算机视觉是人工智能(AI)的一个领域,它使计算机和系统能够从数字图像、视频和其他视觉输入中提取有意义的信息,并根据该信息采取行动或提出建议。如果AI使计算机能够思考,那么计算机视…

webservice接口与HTTP接口学习笔记一、webservice 的概念

webservice接口与HTTP接口学习笔记一、webservice 的概念 目录:导读 一、webservice 的概念 二、webservice接口测试 三、HTTP接口 四、HTTP协议结构 一、webservice 的概念 Web 是使应用程序可以与平台和编程语言无关的方式进行相互通信的一项技术。Web 服务…

关于获取两数相除求百分比,浮点数或整数-相乘,相除-但余数需保留小数点不能有doble继承,应该使用BigDecimal进行四舍五入

int total 3; int finished 2; 类似于这种两数向除---需要将其转化为BigDecimal,利用其函数的方法相除,并用 BigDecimal类型接收结果。 int total 3 int finished 2; BigDecimal result BigDecimal.valueOf(finished).divide(BigDecimal.valueO…

function_url构造函数

目录URL构造函数作用语法返回值构造函数的特定方法URL.createObjectURLURL.revokeObjectURL应用[1]获取url携带参数[2]创建本地url[3]为每个文件生成一个uuidURL构造函数 作用 创建并返回指定url对象 语法 new URL(url,[base])url(必填): 若是rl 是相对 URL,则会…