MySQL进阶实战1,数据类型与三范式
一、选择优化的数据类型
MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。
1、更小的
一般情况下,应该尽量使用较小的数据类型,更小的数据类型通常更快,因为占用更少的磁盘、内存和CPU缓存,处理时需要的CPU周期更短。
2、更简单的
简单的数据类型通常需要更少的CPU周期,整形比字符串类型代价更低,因为字符集和校验规则使字符比较比整形比较更复杂。
3、尽量避免NULL
很多表都包含可为NULL的列,即使应用程序并不需要保存NULL也是如此,因为可为NULL是列的默认属性,通常情况下,最好指定列为NOT NULL。
如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使索引、索引统计和值的比较都更复杂。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理,可为NULL的列被索引时,每个索引记录需要一个额外的字节,在MyISAM里甚至还可能导致固定大小的索引变成可变大小的索引。
4、datetime和timestamp
datetime和timestamp都可以存储时间和日期,都精确到秒,但是timestamp只是用datetime一半的存储空间,并且timestamp会根据时区变化,具有特殊的自动更新能力。
二、整形类型
1、整形
如果存储整形,可以使用tinyint、smallint、mediumint、int、bigint。分别使用8、16、24、32、64位存储空间。它们可以存储的值的范围从-2(n-1)到2(n-1)-1,其中N是存储空间的位数。
整形类型有可选的unsigned属性,表示不允许负值,这大致可以使正数的上限提升一倍。例如tinyint unsigned可以存储的范围是0~255,而tinyint的存储范围是-128 ~ 127。
有符号和无符号类型使用的是相同的存储空间,具有相同的性能,因此可以根据实际情况选择合适的类型。
2、实数
实数是带有小数部分的数字,然而,它们不只是为了存储小数部分,还可以使用decimal存储比bigint还大的数字。
float和double类型支持使用标准的浮点计算进行近似计算。float使用4个字节存储,double使用8个字节存储,相比float有更高的精度和更大的范围。
因为需要额外的空间和计算开销,应该尽量只在对小数进行精确计算时才使用decimal,例如存储财务数据,但在数据量比较大的时候,可以使用bigint代替decimal,将需要存储的货币单位根据小数的位数乘以相应的倍数即可,这样可以避免浮点数存储计算不精确和decimal精确计算代价高的问题。
三、字符串类型
1、varchar
varchar是可变长的字符串,是最常见的字符串数据类型。它比定长类型char更省空间,因为它仅适用必要的空间。varchar需要使用1~2个额外字节记录字符串的长度,如果列的最大长度小于等于255字节,使用1个字节表示,否则使用2个字节。
2、char
char类型是定长的,MySQL总是根据定义的字符串长度分配足够的空间,char值会根据需要采用空格进行长度填充。
- char适合存储很短的字符串或者都是一个长度的字符串,比如MD5值;
- 对于经常变更的数据,char也比varchar更友好,定长的char类型不容易产生碎片;
- 对于较短的列,char也比varchar更有效率,因为不用额外的1字节记录长度。
3、blob和text类型
- blob采用二进制存储,没有排序规则和字符集;
- text采用字符方式存储,有排序规则和字符集;
MySQL会把每个blob和text值当做一个独立的对象处理。存储引擎在存储是通常会做特殊处理。当blob或text的值太大时,InnoDB会使用专门的外部存储空间进行存储,此时每个值在行内需要1~4个字节存储一个指针,然后在外部存储区域存储实际的值。
尽量避免对blob或text字段进行排序,可以通过substring()方法截取一小部分字符进行排序,也不能将blob或text列全部长度的字符串进行索引。
四、三范式
第一范式:每个表的每一列都要保持它的原子性,也就是表的每一列是不可分割的;
第二范式:在满足第一范式的基础上,每个表都要保持唯一性,也就是表的非主键字段完全依赖于主键字段;
第三范式:在满足第一范式和第二范式的基础上,表中不能产生传递关系,要消除表中的冗余性;
五、范式的优缺点
1、优点
- 范式化的更新操作通常比反范式化要快;
- 当数据较好地范式化后,就只有很少或者没有重复数据,所以只需要修改更少的数据;
- 范式化的表通常更小,可以更好地存放在内存中,执行操作更快;
- 很少有冗余的数据,意味着检索数据时更少使用distinct或group by语句;
2、缺点
- 查询时,由于分表的原因,常常需要表关联;
- 可能无法触发索引;
六、反范式的优缺点
1、优点
- 由于都在一个表里,可以减少表关联查询;
- 可能同属于一个索引的字段,不用分表,触发索引更方便;
2、缺点
- 存储过多的冗余数据
- 查询时可能需要distinct或group by的情况更多;
在实际的开发中,都是混用范式化和反范式化,有的时候必要的冗余,有益而无害。
MySQL进阶实战1,数据类型与三范式的更多相关文章
- mysql颠覆实战笔记(三)-- 用户登录(二):保存用户操作日志的方法
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- mysql监控、性能调优及三范式理解
原文:mysql监控.性能调优及三范式理解 1监控 工具:sp on mysql sp系列可监控各种数据库 2调优 2.1 DB层操作与调优 2.1.1.开启慢查询 在My.cnf文件中添加如 ...
- mysql 数据库的设计三范式
三范式 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非主键字段不能相互依赖; 解释: 1NF:原子性 字段不可再分,否则就不是关系数据库; 2NF:唯一性 一个表只说明一个事物 ...
- MySQL开发——【多表关系、引擎、外键、三范式】
多表关系 一对一关系 一对多或多对一关系 多对多关系 MySQL引擎 所谓的MySQL引擎就是数据的存储方式,常用的数据库引擎有以下几种: Myisam与InnoDB引擎之间的区别(面试) ①批量插入 ...
- mysql颠覆实战笔记(六)--商品系统设计(三):商品属性设计之固定属性
今天我们来讲一下商品属性 我们知道,不同类别的商品属性是不同的. 我们先建一个表prod_class_attr:
- mysql数据库的三范式的设计与理解
一般的数据库设计都需要满足三范式,这是最基本的要求的,最高达到6NF,但是一般情况下3NF达到了就可以 一:1NF一范式的理解: 1NF是关系型数据库中的最基本要求,就是要求记录的属性是原子性,不可分 ...
- mysql三范式
第一范式:有主键,具有原子性,字段不可分割. 第二范式:完全依赖,没有部分依赖. 第三范式:没有传递依赖. 总结:数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时候会拿冗余还速度,最总用的 ...
- 【Python高级工程师之路】入门+进阶+实战+爬虫+数据分析整套教程
点击了解更多Python课程>>> 全网最新最全python高级工程师全套视频教程学完月薪平均2万 什么是Python? Python是一门面向对象的编程语言,它相对于其他语言,更加 ...
- mysql进阶(二十九)常用函数
mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...
- 数据库学习之MySQL进阶
数据库进阶 一.视图 数据库视图是虚拟表或逻辑 ...
随机推荐
- 几篇关于MySQL数据同步到Elasticsearch的文章---第一篇:Debezium实现Mysql到Elasticsearch高效实时同步
文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484358&idx=1&sn=3a78347 ...
- day43-反射02
2.Class类 2.1基本介绍 Class类也是类,因此也继承Object类 Class类对象不是new出来的,而是系统创建的 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次 每个 ...
- C++自学笔记 头文件 (header file)关于 #include 和.h
头文件 在C++中定义Definition一个类的时候 要用分别的.h和.cpp文件去定义这个类 .h和.cpp成对出现 类的声明declaration和函数原型放在头文件里(.h) 定义这些函数的结 ...
- PAT (Basic Level) Practice 1031 查验身份证 分数 15
一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8, ...
- PAT520 钻石争霸赛 7-6 随机输一次
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1000; ll n ...
- P3250 [HNOI2016] 网络 (树剖+堆/整体二分+树上差分+树状数组)
解法1: 本题有插入路径和删除路径,在每个节点维护插入堆和删除堆,查询时两者top一样则一直弹出.如果每个节点维护的是经过他的路径,显然有些不好处理,正难则反,每个点维护不经过他的路径,那么x节点出了 ...
- Vue学习之--------Vue中过滤器(filters)的使用(代码实现)(2022/7/18)
1.过滤器 1.1 概念 过滤器: 定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理). 语法: 1.注册过滤器:Vue.filter(name,callback) 或 new V ...
- Hugging Face发布diffuser模型AI绘画库初尝鲜!
作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 TensorFlow 实战系列:https://www.showmeai ...
- SoringCloud(四) - 微信获取用户信息
1.项目介绍 2.微信公众平台 和 微信开放文档 2.1 微信公众平台 2.1.1 网址链接 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?ac ...
- Windows下pip换成清华源
1.在C:\Users\用户名\ 下创建 pip 文件夹2.在文件夹内创建pip.ini 文件, 添加如下内容: [global] timeout = 6000 index-url = https:/ ...