读高性能MySQL(第4版)笔记06_优化数据类型(上)

1. 良好的逻辑设计和物理设计是高性能的基石

1.1. 反范式的schema可以加速某些类型的查询,但同时可能减慢其他类型的查询

1.2. 添加计数器和汇总表是一个优化查询的好方法,但它们的维护成本可能很

1.3. 将修改schema作为一个常见事件来规划

2. 让事情尽可能小而简单是一个好主意

2.1. 尽量避免在设计中出现极端情况

2.2. 使用小的、简单的、适当的数据类型,并避免使用NULL,除非确实是对真实数据进行建模的正确方法

2.3. 尝试使用相同的数据类型来存储相似或相关的值,尤其是在联接条件中使用这些值时

2.4. 注意可变长度字符串,它可能会导致临时表和排序的全长内存分配不乐观

2.5. 如果可能的话,尝试使用整数作为标识符

2.6. 小心使用ENUM和SET类型

2.7. 避免使用BIT类型

3. 选择正确的数据类型对于获得高性能至关重要

3.1. 更小的通常更好

3.1.1. 尽量使用能够正确存储和表示数据的最小数据类型

3.1.2. 更小的数据类型通常更快,因为它们占用的磁盘、内存和CPU缓存的空间更少,并且处理时需要的CPU周期也更少

3.1.3. 在schema中的多个地方增加数据类型范围是一个痛苦且耗时的操作

3.1.4. 如果无法确定哪个数据类型是最好的,请选择你认为不会超过的最小数据类型

3.2. 简单为好

3.2.1. 简单数据类型的操作通常需要更少的CPU周期

3.2.2. 整型数据比字符型数据的比较操作代价更低

3.2.2.1. 字符集和排序规则(collation)使字符型数据的比较更复杂

3.2.2.2. 应该将日期和时间存储为MySQL的内置类型而不是字符串类型

3.2.2.3. 应该用整型数据存储IP地址

3.3. 尽量避免存储NULL

3.3.1. 最好指定列为NOT NULL,除非明确需要存储NULL值

3.3.2. 如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引、索引统计和值比较都更复杂

3.3.3. 可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理

3.3.4. 可为NULL的列改为NOT NULL带来的性能提升比较小

4. 整数类型

4.1. 整数(whole number)

4.1.1. TINYINT、SMALLINT、MEDIUMINT、INT或BIGINT

4.1.1.1. 使用8、16、24、32和64位存储空间

4.1.2. 整数类型有可选的UNSIGNED属性,表示不允许负值,这大致可以使正数的上限提高一倍

4.1.3. 有符号和无符号类型使用相同的存储空间,并具有相同的性能,因此可以根据数据实际范围选择合适的类型

4.1.4. 整数计算通常使用64位的BIGINT整数

4.1.5. 对于存储和计算来说,INT(1)和INT(20)是相同的

4.1.6. 一些大容量的场景,可以考虑使用BIGINT代替DECIMAL,将需要存储的货币单位根据小数的位数乘以相应的倍数即可

4.1.7. 存储财务数据并精确到万分之一分,则可以把所有金额乘以一百万,然后将结果存储在BIGINT里

4.1.8. 同时避免浮点存储计算不精确和DECIMAL精确计算代价高的问题

4.2. 实数(real number,带有小数部分的数字)

4.2.1. 不仅适用于带小数的数字,也可以使用DECIMAL存储比BIGINT还大的整数

4.2.2. 浮点类型通常比DECIMAL使用更少的空间来存储相同范围的值

4.2.3. FLOAT列使用4字节的存储空间

4.2.4. DOUBLE占用8字节,比FLOAT具有更高的精度和更大的值范围

4.2.5. 应该尽量只在对小数进行精确计算时才使用DECIMAL

5. 字符串类型

5.1. 字符串长度定义的不是字节数,是字符数

5.2. VARCHAR

5.2.1. 用于存储可变长度的字符串,是最常见的字符串数据类型

5.2.2. 它比固定长度的类型更节省空间,因为它仅使用必要的空间

5.2.3. 更少的空间用于存储更短的值

5.2.4. 需要额外使用1或2字节记录字符串的长度

5.2.4.1. VARCHAR(1000)的列则需要1002个字节,因为需要2字节存储长度信息

5.2.5. 节省了存储空间,所以对性能也有帮助

5.2.5.1. 由于行是可变长度的,在更新时可能会增长,这会导致额外的工作

5.2.6. 推荐使用场景

5.2.6.1. 字符串列的最大长度远大于平均长度

5.2.6.2. 列的更新很少,所以碎片不是问题

5.2.6.3. 使用了像UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储

5.3. CHAR

5.3.1. 总是为定义的字符串长度分配足够的空间

5.3.2. 当存储CHAR值时,MySQL删除所有尾随空格

5.3.3. 如果需要进行比较,值会用空格填充

5.3.4. 推荐使用场景

5.3.4.1. 存储非常短的字符串

5.3.4.1.1. 对于非常短的列,CHAR也比VARCHAR更高效
5.3.4.1.2. 设计为只保存Y和N的值的CHAR(1)在单字节字符集中只使用1字节,但VARCHAR(1)需要2字节,因为还有一个记录长度的额外字节

5.3.4.2. 所有值的长度都几乎相同的情况

5.3.5. 对于经常修改的数据,CHAR也比VARCHAR更好,因为固定长度的行不容易出现碎片

5.4. 二进制字符串与常规字符串非常相似,但它们存储的是字节而不是字符

5.5. 填充也不同:MySQL填充BINANRY用的是\0(零字节)而不是空格,并且在检索时不会去除填充值

5.6. 字节比较的优势

5.6.1. 大小写不敏感

5.6.2. 二进制比较比字符比较简单得多,因此速度更快

5.7. BLOB和TEXT类型

5.7.1. 存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储

5.7.2. 字符类型

5.7.2.1. TINYTEXT、SMALLTEXT、TEXT、MEDIUMTEXT和LONGTEXT

5.7.2.2. TEXT是SMALLTEXT的同义词。

5.7.2.3. 有字符集和排序规则

5.7.3. 二进制类型

5.7.3.1. TINYBLOB、SMALLBLOB、BLOB、MEDIUMBLOB、LONGBLOB

5.7.3.2. BLOB是SMALLBLOB的同义词

5.7.3.3. 二进制数据,没有排序规则或字符集

5.7.3.4. 如果需要在检索后保持值不变,请小心使用BINARY类型,MySQL会使用\0将其填充到需要的长度

5.7.4. 当BLOB和TEXT值太大时,InnoDB会使用独立的“外部”存储区域,此时每个值在行内需要1~4字节的存储空间,然后在外部存储区域需要足够的空间来存储实际的值

5.7.5. 只对这些列的最前max_sort_length字节而不是整个字符串做排序

5.7.6. 不能将BLOB和TEXT数据类型的完整字符串放入索引,也不能使用索引进行排序

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

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

相关文章

仅做笔记用:Stable Diffusion 通过 ControlNet 扩展图片 / 扩图

发觉之前的 Outpainting 脚本效果仍旧不是很理想。这里又找了一下有没有效果更好的途径来扩图。于是就找到了通过 ControlNet 的方式来实现效果更好的扩图。这里临时记录一下在 Stable Diffusion 怎么使用 ControlNet 来扩展图片。 下载 control_v11p_sd15_inpaint_fp16.safet…

【源码】JavaWeb+Mysql招聘管理系统 课设

简介 用idea和eclipse都可以&#xff0c;数据库是mysql&#xff0c;这是一个Java和mysql做的web系统&#xff0c;用于期末课设作业 cout<<"如果需要的小伙伴可以http://www.codeying.top";可定做课设 线上招聘平台整合了各种就业指导资源&#xff0c;通过了…

Android获取系统读取权限

在Androidifest.xml文件中加上授权语句 <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/>

Git 概述命令、idea中的使用

目录 Git概述 Git代码托管服务 Git常用命令 Git 全局设置 获取 Git 仓库 ​编辑Git 工作区中文件的状态 本地仓库操作 远程仓库操作 ​编辑分支操作 标签操作 在IDEA中使用Git 1.获取Git仓库 .gitignore 表示忽略 2.本地仓库操作 3.远程仓库操作 4.分支操作 Git是…

c++qt day2

封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员函数&#xff1a;void…

虚拟机Ubuntu操作系统最基本终端命令(安装包+详细解释+详细演示)

虚拟机及乌班图&#xff08;Ubuntu操作系统&#xff09; 提示&#xff1a;大家需要软件的可以直接在此链接中提取 链接&#xff1a;https://pan.baidu.com/s/1_4VHGTlXjIuVhBINeOuBCA 提取码&#xff1a;nd0c 文章目录 虚拟机及乌班图&#xff08;Ubuntu操作系统&#xff09;终…

多线程之基础篇(一)

一、Thread类 1、线程的创建 大家都熟知创建单个线程的三种方式&#xff0c;通过继承Thread类创建线程并重写该类的run()方法&#xff1b;通过实现Runnable接口创建线程一样要重写run()方法&#xff1b;以上的两个run()方法都是线程的执行体&#xff1b;第三&#xff0c;使用…

组件安全以及漏洞复现

组件安全 1. 概述 A9:2017-使⽤含有已知漏洞的组件 A06:2021-Vulnerable and Outdated Components ​ 组件&#xff08;例如&#xff1a;库、框架和其他软件模块&#xff09;拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用&#xff0c;可能会造成…

目标检测入门

一、目标检测任务对比 二、目标检测发展路线 基于深度学习的目标检测大致可以分为一阶段(One Stage)模型和二阶段(Two Stage)模型。目标检测的一阶段模型是指没有独立地提取候选区域(Region Proposal)&#xff0c;直接输入图像得到图中存在的物体类别和相应的位置信息。典型的一…

.net 7 隐藏swagger的api

1.写一个隐藏接口特性表示 using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen;using System.Web.Http.Description;namespace JiaTongInterface.Filter {public class SwaggerApi : Swashbuckle.AspNet…

iframe 实现跨域,两页面之间的通信

一、 背景 一个项目为vue2&#xff0c;一个项目为vue3&#xff0c;两个不同的项目实现iframe嵌入&#xff0c;并实现通信 二、方案 iframe跨域时&#xff0c;iframe组件之间常用的通信&#xff0c;主要是H5的possmessage方法 三、案例代码 父页面-vue2&#xff08;端口号为…

“投资教父”熊晓鸽老了,IDG光环不再

作者 | 鸠白 艺馨 排版 | Cathy 监制 | Yoda 出品 | 不二研究 2017年&#xff0c;世界互联网大会上&#xff0c;“投资教父”熊晓鸽问映客的创始人&#xff1a;“今年你们利润能有多少&#xff1f;” 对方笑答&#xff1a;“5个亿吧&#xff01;” “才五个亿&#xff1f…

Kubernetes (K8s) 解读:微服务与容器编排的未来

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

leetcode 234. 回文链表

2023.9.5 本题先将链表的节点值移到数组中&#xff0c;再用双指针去判断该数组是否为回文的即可。 代码如下&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* …

细说GNSS模拟器的RTK功能(三)应用实例01——运行和分析模拟

在上期文章中我们介绍了基于RTCM插件来模拟RTCM使用的硬件和软件设置&#xff0c;本期文章我们将继续进行运行和分析模拟。 使用RTCM插件 运行和分析模拟 连接Ublox接收器 虽然采用了Novatel接收器进行模拟来获得更好的位置精度&#xff0c;但也同样适用于Ublox接收器。要将…

【数据结构】前言概况 - 树

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;数据结构 &#x1f525;该文章针对树形结构作出前言&#xff0c;以保证可以对树初步认知。 目录&#xff1a; &#x1f30d;前言:&#x1f3…

Pytorch Advanced(三) Neural Style Transfer

神经风格迁移在之前的博客中已经用keras实现过了&#xff0c;比较复杂&#xff0c;keras版本。 这里用pytorch重新实现一次&#xff0c;原理图如下&#xff1a; from __future__ import division from torchvision import models from torchvision import transforms from PIL…

Json“牵手”亚马逊商品详情数据方法,亚马逊商品详情API接口,亚马逊API申请指南

亚马逊平台是美国最大的一家网络电子商务公司&#xff0c;亚马逊公司是1995年成立&#xff0c;刚开始只做网上书籍售卖业务&#xff0c;后来扩展到了其他产品。现在已经是全世界商品品种最多的网上零售商和第二互联网公司&#xff0c;亚马逊是北美洲、欧洲等地区的主流购物平台…

数据结构:线性表之-循环双向链表(万字详解)

目录 基本概念 1&#xff0c;什么是双向链表 2&#xff0c;与单向链表的区别 双向链表详解 功能展示&#xff1a; 1. 定义链表 2&#xff0c;创建双向链表 3&#xff0c;初始化链表 4,尾插 5&#xff0c;头插 6&#xff0c;尾删 判断链表是否被删空 尾删代码 7&a…

我们这一代人的机会是什么?

大家好&#xff0c;我是苍何&#xff0c;今天作为专业嘉宾参观了 2023 年中国国际智能产业博览会&#xff08;智博会&#xff09;&#xff0c;是一场以「智汇八方&#xff0c;博采众长」为主题的汇聚全球智能技术和产业创新的盛会&#xff0c;感触颇深&#xff0c;随着中国商业…