(二)、MySQL中Schema与数据类型优化

        schema为模式,指数据库对象集合,包括表、视图等对象。

一、选择优化的数据类型

        MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。下列是几个关于选择类型的原则。

        更小的通常更好
       
一般情况下,应该使用可以存储数据的最小数据类型。更小的数据类型通常更快,因为他们
        占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少。

        简单就好
        简单数据类型的操作通常需要更少的CPU周期。例如,整数比字符操作代价更低,应为字符
        集和校对规则使字符比整型更复杂

        尽量避免NULL
                很多表都包含可为NULL的列,即使应用程序并不需要保存NULL也是如此,因为NULL是
        列的默认属性。通常情况下最好指定为NOT NULL。
                如果查询中包含可为NULL的列,对MySQL来说更难优化,因为NULL的列使得索引、索
        引统计和值比较更加复杂。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处
        理。
                通常把可为NULL的列改为NOT NULL带来的性能提升比较小,所以没有必要首先在现有
        schema中查找帮修改这种情况。

1、整数类型

        有两种类型的数字:整数和实数。存储整数可以使用这些类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。分别使用8、16、24、32、64位存储空间。
        整数类型有可选的UNSIGNED属性,表示不允许负值,这大致可以使正数的上限提高一倍。例如,TINYINT开启UNSIGNED属性可以存储0~255,而没有开启则为-128~127
        有符号和无符号类型使用相同的存储空间,并具有相同的性能,可根据实际情况选择合适的类型。
        MySQL可以为整数类型指定宽度,例如int(11),对于大多数应用是没有意义的:它不会限制值的合法范围。只是规定了交互工具显示字符的个数,对于存储和计算来说,int(1)和int(20)是相同的。

2、实数类型

        实数是带有小数部分的数字。MySQL既支持精确类型,也支持不精确类型。float和double类型支持使用标准的浮点运算进行近似计算。如果需要知道浮点运算时怎么计算的,则需要研究所使用的平台的浮点数的具体实现。
        decimal类型用于存储精确的小数。在MySQL5.0或更高版本,decimal类型支持精确计算。因为CPU不支持decimal的直接计算,所以在MySQL5.0以及跟高版本中,服务器自身实现了decimal的高精度计算。相对而言,CPU直接支持原生浮点数计算,所以浮点数运算明显更快。
        因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用decimal。但在数据量大时,可以考虑使用bigint代替,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。

3、字符串类型

        varchar
        varchar类型用于存储可变长字符串。它比定长类型更节省空间,因为它仅使用必要的空间。
        varchar需要使用1或2个额外字节记录字符串长度:如果列的最大长度小于或等于255,则只
        需要1个字节表示,否则需要2个。
        由于行是变长的,在update时可能使行变得比原来更长,这就需要做额外的工作。如果一个
        行占用的空间增长,并且在页内没有更多的空间可以存储。在这种情况下,不同存储引擎室
        不一样的。例如MyISAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使用可以放进
        页内。

        char
        char类型是定长的:MySQL总是根据定义的字符串长度分配足够的空间。当存储char值
        时,MySQL会删除所有的末尾空格。char值会根据需要采用空格进行填充以方便比较。

使用varchar(5)和varchar(255)存储“aaa”的空间开销是一样的。那么短的有什么优势。           更长的列会消耗更多内存,因为MySQL通常会分配固定大小的内存块来保存内部值。

        BLOB和Text类型
                blob和text都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式
        存储。
                MySQL把每个Blob和text值当作一个独立的对象处理。存储引擎在存储时通常会做特殊
        处理。当Blob和Text值太大时,InnoDB会使用专门的“外部”存储区域来存储,此时每个值在行
        内需要1~4字节存储一个指针,然后在外部存储区域存储实际的值。
                MySQL对这两种类型进行排序时,只会对每个列的最前max_sort_length字节做排序。

4、日期和时间类型

                MySQL能存储的最小时间细粒度为秒。MySQL提供两种相似日期类型:DATETIME和
        TIMESTAMP。
                DATETIME保存最大范围的值,1001~9999年,精度为秒。它把日期和时间封装到格
        式为YYYYMMDDHHMMSS的整数中,与时区无关。使用8个字节的存储空间。
                TIMESTAMP:TIMESTAMP之使用4个字节的存储空间,范围为1970到2038年

5、位数据类型

                BIT:bit(1)定义一个包含单位的字段,bit(2)存储2个位。bit列最大的长度是64个位。bit
        的行为因存储引擎而异。MyISAM会打包存储所有的bit列,所以17个单独的bit列只需要17个
        位存储,MyISAM只需要3个字节就能存储这17个bit列。其他存储引擎Memory和InnoDB,为
        每个bit列使用一个足够存储的最小整数类型存放,所以不能节省存储空间。
                MySQL吧bit当作字符串类型,而不是数字类型。当检索bit(1)的值时,结果是一个包含二
        进制0或1值的字符串,而不是ASCII码的”0“或”1“。然而,在数字上下文的场景中检索时,结
        果是将位字符串转换成的数字。
                如果想在一个bit的存储空间存储一个true/false值,另一个方法是创建一个可以为空
        char(0)列。


                SET:如果需要保存很多true/false值,可以考虑合并这些列到一个set数据类型,他在
        MySQL内部是以一系列打包的位的集合来表示的。这样就有效利用了存储空间,并且MySQL
        有像find_in_set()和field()函数来查询使用。它主要缺点是改变列的定义的代价较高:需要
        alter table。

  6、选择标识符

        为标识列选择合适的数据类型是非常重要的。
                1、相关属性选择相同的类型
                2、选择时需要考虑存储类型,以及这种类型在MySQL中是怎么计算的。
                3、在满足值的范围的需求,并且预留未来增长空间的前提下,应该选择最小的数据类型

        整数类型
                通常是标识列最好的选择,因为他们很快并且可以使用auto_increment

        enum和set
                他们适合存储固定信息,如有序的状态、产品类型、人的性别

        字符串
                应该避免使用字符类型作为标识列,因为他们很消耗空间,并且通常比数字类型慢。尤
        其是在MyISAM表里使用,MyISAM默认对字符串使用压缩索引,这会导致查询慢。
                对于完全随机的字符串也需要注意,例如md5()、sha1()、uuid()产生的字符串。这些函
        数生成的新值分布在很大的空间内,这会导致insert以及一些select语句变慢。

  • 因为插入值会随机的写到索引不同位置,所以使得insert语句更慢。这会导致页分裂、磁盘随机访问,以及对于聚簇存储引擎产生聚簇碎片。
  • select语句会变得更慢,因为逻辑上相邻的行会分布在磁盘和内存的不同地方。
  • 随机值导致缓存对所有类型的查询语句效果都很差,因为会使得缓存赖以工作的访问局部性原理失效。

                  

7、特殊类型数据

        对于IPv4地址,人们通常使用VARCHAR列来存储。然而他们实际上是32位无符号整数,不是字符串。用小数点将地址分成四段的表示方法只是为了让人们阅读容易。所以应该使用无符号整数存储IP地址。MySQL提供了inet_aton()和inet_ntoa()函数在这两种表示方法之间转换。

        select inet_aton("1.1.1.1")     >>    16843009

        select inet_ntoa(16843009)   >>     1.1.1.1

二、MySQL schema设计中的陷阱

1、太多的列

        MySQL的存储引擎API工作时需要在服务层和存储引擎层之间通过缓冲格式拷贝数据,然后在服务器层将缓冲内容解码成各列。从行缓冲中将编码过的列转换成行数据结构的操作代价非常高。转换的代价依赖列的数量。

2、太多关联

        “实体-属性-值”(EAV)设计模式是一种常见的糟糕的设计模式,尤其是在MySQL下不能靠谱的工作。MySQL限制了每个关联操作最多只能有61张表关联,但是EAV数据库需要许多自关联。事实上在许多关联少于61张表的情况下,解析和优化查询的代价也会成为MySQL的问题。一般单个查询最好在12个表以内做关联。

3、非此发明的NULL

        需要存储一个事实上的"空值"到表中时,也不一定非得使用NULL。也可以使用0、或者某个特定的字符作为代替。

           

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智安网络|探索人机交互的未来:自然语言处理的前沿技术

自然语言处理是人工智能领域中研究人类语言和计算机之间交互的一门学科。它涉及了语言的理解、生成、翻译、分类和摘要等多个方面。随着人们对自然语言处理的重视和需求不断增长,成为了热门的研究方向。 首先,我们需要了解自然语言处理的基本概念。自然…

Zookeeper经典应用场景实战(一)

1. Zookeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。 可供选择的Java客户端API有: ZooKeeper官方的Java客户端API。 第三方的Java客户端API,比如Curator。 ZooKeeper官方的客户端API提供了基本的操…

【数据结构】归并排序 的递归实现与非递归实现

归并排序 前言一、归并排序递归实现(1)归并排序的核心思路归并排序运行图例(2)归并排序实现的核心步骤(3)归并排序码源详解(4)归并排序效率分析1)时间复杂度 O&#xff0…

Leetcode-234 回文链表

我的解法:使用栈,定义了len略微复杂,拿链表的后半部分和前半部分比较即可,没必要全部比较 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* List…

[极客大挑战 2019]Http 1

题目环境: 看起来挺花里胡哨的 F12查看源代码寻找隐藏文件 这是啥子呀,果然防不胜防 点击隐藏文件Secret.php 它不是来自这个地址的请求 报头:https://Sycsecret.buuoj.cn 需要抓包,在抓包前了解部分数据包参数 GET:到 Host:来自 …

ElasticSearch离线安装

1. 上传和解压软件 将elasticsearch-7.11.2-linux-x86_64.tar.gz和kibana-7.11.2-linux-x86_64.tar.gz 上传到/data/es目录 解压文件 tar -zxvf elasticsearch-7.11.2-linux-x86_64.tar.gz tar -zxvf kibana-7.11.2-linux-x86_64.tar.gz 2. 创建es用户 因为安全问题&#xff…

手机玻璃盖板为什么需要透光率检测

手机盖板,也称为手机壳或保护套,是一种用于保护手机外观和延长使用寿命的装置。它们通常由塑料、硅胶、玻璃或金属等材料制成,并固定在手机外壳上,其中任何一个工序出现差错,都有可能导致手机盖板产生缺陷,例如漏油、透…

编程中的零代码和低代码解决方案对比

目录 一、传统开发vs低代码vs零代码 (1)传统开发: (2)低代码开发: (3)零代码开发 二、5种常见的应用场景 三、零代码和低代码 随着企业数字化拉开序幕,低代码( Low Code …

【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉…

10-27 maven概念

maven maven的概念模型: 项目对象模型(POM: Project object Model),一组标准集合: pom.xml 依赖管理系统(Dependency Management System) 项目生命周期(Project Lifecycle) 项目对象模型: 把项目当成一个对象,描述这个项目,使用p…

【springboot配置项动态刷新】与【yaml文件转换为java对象】

文章目录 一,序言二,准备工作1. pom.xml引入组件2. 配置文件示例 三,自定义配置项动态刷新编码实现1. 定义自定义配置项对象2. 添加注解实现启动时自动注入3. 实现yml文件监听以及文件变化处理 四,yaml文件转换为java对象1. 无法使…

机器学习——逻辑回归

一、分类问题 监督学习的最主要类型 分类(Classification): 身高1.85m,体重100kg的男人穿什么尺码的T恤?根据肿瘤的体积、患者的年龄来判断良性或恶性?根据用户的年龄、职业、存款数量来判断信用卡是否会…

Mac VsCode g++编译报错:不支持C++11语法解决

编译运行时报错: [Running] cd “/Users/yiran/Documents/vs_projects/c/” && g 1116.cpp -o 1116 && "/Users/yiran/Documents/vs_projects/c/"1116 1116.cpp:28:22: warning: range-based for loop is a C11 extension [-Wc11-extensi…

浅谈前端自定义VectorGrid矢量瓦片样式

目录 前言 一、VectorGrid相关API介绍 1、VectorGrid 2、 LayerStyles样式详解 二、样式自动配置 1、页面定义 2、地图及PBF瓦片引入 3、矢量瓦片样式定义 4、鼠标事件交互 三、最终效果 1、自定义样式展示 2、鼠标交互 总结 前言 在上一篇博客中,详细讲…

支付卡行业(PCI)PIN安全要求和测试程序 7个控制目标、33个要求及规范性附录ABC 密钥注入-PCI认证-安全行业基础篇4

概述 用于在ATM和POS终端进行在线和离线支付卡交易处理期间,对个人身份号码(PIN)数据进行安全管理、处理和传输。 该标准具体包括 7 个控制目标和 33 个安全要求, 标准的结构分为标准主体部分,标准附录(N…

FPGA高端项目:图像缩放+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案我这里已有的图像处理方案 3、设计思路框架设计框图视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择…

C语言:深入浅出qsort方法,编写自己的qsort完成冒泡排序

目录 什么是qsort? 函数原型 比较函数 compar 排序整型数组 排序结构体数组 根据成员字符排序 strcmp函数 根据成员整型排序 自定义qsort实现冒泡排序 qsort的实现原理 具体步骤 快速排序示例代码: 什么是qsort? qsort是 C …

YOLO目标检测——交通标志分类数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用:交通标志识别数据集在自动驾驶、交通安全监控、智能交通系统、驾驶员辅助系统和城市规划等领域都有广泛应用的潜力数据集说明:交通标志分类数据集,真实场景的高质量图片数据,数据场景丰富,含多场景白天黑…

OOM排查

OOM排查 一,原因 1.一次性申请对象太多,创建了大量对象,尤其从表中读取了大量数据,循环中大量创建对象,放入list中。方案:限量 2.内存资源耗尽为释放,如connction,线程。方案&#…

猫罐头什么牌子好?2023营养又美味的猫主食罐头推荐!

亲爱的猫咪主人,你是否为你家小猫咪的挑食问题感到困扰?作为一位在宠物店工作了七年,负责喂养三十多只猫咪的店长,我对许多品牌的猫罐头都非常熟悉了。对于猫罐头哪个牌子好这个问题,我想借此机会分享一些见解。 在本…
最新文章