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

Mysql高性能优化笔记(含578页笔记PDF文档),收藏了 Mysql是大家平时都会用到的技术点,这份578页笔记文档收藏了! 阅读详情

1. ENUM(枚举)

1.1. MySQL在存储枚举时非常紧凑,会根据列表值的数量压缩到1或者2字节中

1.2. 转换为ENUM会使表变小

1.3. 如果表中有其他索引,减少主键大小也会使这些非主键索引小得多

1.4. ENUM列可以存储一组预定义的不同字符串值

1.5. ENUM字段是根据内部整数值排序的,而不是根据字符串本身

1.6. 查询中使用FIELD()函数显式地指定排序顺序,但这会导致MySQL无法利用索引消除排序

1.7. MySQL将每个枚举值存储为整数,并且必须进行查找以将其转换为字符串表示,因此ENUM列有一些开销

1.8. 将CHAR/VARCHAR列联接到ENUM列可能比联接到另一个CHAR/VARCHAR列更慢

1.9. 通常的设计实践是使用带有整数主键的“查找表”,以避免在联接中使用字符串

1.10. 更改ENUM中的有效值会导致需要做schema变更

2. 日期和时间类型

2.1. MySQL可以存储的最小时间粒度是微秒

2.2. DATETIME

2.2.1. 从1000年到9999年,精度为1微秒

2.2.2. 以YYYYMMDDHHMMSS格式存储压缩成整数的日期和时间

2.2.3. 与时区无关

2.2.4. 8字节的存储空间

2.2.5. 以可排序、无歧义的格式显示DATETIME值

2.2.6. ANSI表示日期和时间的标准方式

2.2.7. 保留日期和时间的文本表示

2.3. TIMESTAMP

2.3.1. 自1970年1月1日格林尼治标准时间(GMT)午夜以来经过的秒数

2.3.1.1. 与UNIX时间戳相同

2.3.2. 从1970年到2038年1月19日

2.3.2.1. 会遇到2038年的问题
2.3.2.1.1. 使用带符号的32位INT,可以表达直到2038年的时间
2.3.2.1.2. 使用无符号的32位INT,可以表达直到2106年的时间
2.3.2.1.3. 使用64位,还可以超出这些范围

2.3.3. 时间戳显示的值依赖于时区

2.3.3.1. MySQL服务器、操作系统和客户端连接都有时区设置
2.3.3.2. 存储值0的TIMESTAMP在美国东部标准时间(EST)中显示为1969-12-31   19:00:00,与格林尼治标准时间(GMT)差5小时

2.3.4. 4字节的存储空间

2.3.5. FROM_UNIXTIME()函数来将UNIX时间戳转换为日期

2.3.6. UNIX_TIMESTAMP()函数将日期转换为UNIX时间戳

2.3.7. 保留与所使用时区相关的值

2.3.8. TIMESTAMP的行为规则很复杂,并且在不同的MySQL版本中会发生变化,因此你应该验证数据库的行为是否符合需要。在对TIMESTAMP列进行更改后,通常最好检查SHOW CREATE TABLE命令的输出

2.3.9. 特殊属性

2.3.9.1. 当插入一行记录时没有指定第一个TIMESTAMP列的值,MySQL会将该列的值设置为当前时间
2.3.9.2. 当更新一行记录时没有指定第一个TIMESTAMP列的值,MySQL默认也会将该列的值更新为当前时间
2.3.9.3. 可以为任何TIMESTAMP列配置插入和更新行为
2.3.9.4. TIMESTAMP列在默认情况下为NOT NULL,这也和其他的数据类型不一样

3. 位压缩数据类型

3.1. 从技术上来说都是字符串类型

3.2. BIT

3.2.1. 可以使用BIT列存储一个或多个true/false值

3.2.2. 视为字符串类型,而不是数字类型

3.2.3. 避免使用这种类型

3.2.3.1. 建议使用TINYINT

3.3. SET

3.3.1. 如果需要存储多个true/false值,可以考虑使用MySQL原生的SET数据类型

3.3.2. 以一组打包的位的集合来表示的

3.3.3. 更有效地利用存储空间

3.3.4. FIND_IN_SET()和FIELD()等函数,使其易于在查询中使用

3.3.5. 替代方法是使用整数作为二进制位的打包集合

3.3.5.1. 可以在不使用ALTER TABLE的情况下更改字段表示的“枚举”
3.3.5.2. 查询更难编写和理解

4. JSON数据类型

4.1. 决定使用原生SQL还是JSON取决于在数据库中存储JSON的便捷性是否大于性能

4.2. 如果每天访问这些数据数百万次或数十亿次,速度差异就会累加起来

4.3. 使用SQL列的速度仍然更好于JSON列

5. 标识符

5.1. 引用行及通常使其唯一的方式

5.2. 为标识符列选择数据类型时,应该与联接表中的对应列保持一致

5.3. 在为标识符列选择类型时,不仅需要考虑存储类型,还需要考虑MySQL如何对该类型执行计算和比较

5.4. 在可以满足值的范围的需求,并且预留未来增长空间的前提下,应该选择最小的数据类型

5.5. 整数通常是标识符的最佳选择

5.5.1. 速度快

5.5.2. 自动递增

5.6. 对于标识符来说,ENUM和SET类型通常是糟糕的选择

5.6.1. ENUM和SET列适用于保存订单状态或产品类型等信息

5.7. 应避免使用字符串类型作为标识符的数据类型

5.7.1. 很消耗空间

5.7.2. 比整数类型慢

5.8. 对于完全“随机”的字符串要非常小心

5.8.1. MD5()、SHA1()或UUID()生成的字符串

5.9. 新值会任意分布在很大的空间内,这会减慢INSERT和某些类型的SELECT查询的速度

5.9.1. 插入的值会写到索引的随机位置,所以会使得INSERT查询变慢

5.9.2. 导致页分裂、磁盘随机访问,以及对于聚簇存储引擎产生聚簇索引碎片

5.9.3. SELECT查询也会变慢,因为逻辑上相邻的行会广泛分布在磁盘和内存中

5.9.4. 对于所有类型的查询,随机值都会导致缓存的性能低下,因为它们会破坏引用的局部性,而这正是缓存的工作原理

5.10. 存储通用唯一标识符(UUID)值,则应该删除破折号

5.10.1. 更好的做法是,使用UNHEX()函数将UUID值转换为16字节的数字,并将其存储在一个BINARY(16)列中

5.10.2. 可以使用HEX()函数以十六进制格式检索值

6. 特殊数据类型

6.1. IPv4地址

6.1.1. 使用VARCHAR(15)列来存储

6.1.2. 实际上是32位无符号整数,而不是字符串

6.1.2.1. 小数点将地址分成四段的表示方法只是为了让人们阅读容易
6.1.2.2. 存储为无符号整数

6.1.3. INET_ATON()和INET_NTOA()函数来在这两种表示形式之间进行转换

6.1.4. 从VARCHAR(15)的约16字节缩减到无符号32位整数的4字节

7. schema设计中的陷阱

7.1. 太多的列

7.2. 太多的联接

7.2.1. MySQL限制每个联接有61个表

7.3. 全能的枚举

7.3.1. 要小心过度使用ENUM

7.4. 变相的枚举

7.4.1. ENUM列允许在列中保存一组已定义值中的单个值

7.4.2. SET列则允许在列中保存一组已定义值中的一个或多个值

7.4.3. 如果真和假两种情况不会同时出现,那么毫无疑问应该使用ENUM列而不是SET列

7.5. NULL不是虚拟值

7.5.1. 在表中存储事实上的“空值”,可以使用0、特殊值或空字符串作为代替

7.5.2. 当需要表示未知值时,不要太害怕使用NULL

7.5.3. 在某些情况下,使用NULL比使用某个虚拟常数更好

7.5.4. MySQL会对NULL值进行索引,而Oracle则不会

8. schema管理

8.1. 修改schema是数据库工程师必须承担的最常见任务之一

8.2. schema变更管理视为“数据存储平台”的一部分

8.3. 尽可能靠近现有的软件部署工具和工作流程

8.4. 应该使用能够集成针对schema更改的基本检测的工具,以确保满足一些基线需求

8.5. 如果所在的组织使用多种编程语言且发展迅速,请确保不会意外地引入人为瓶颈

8.6. Skeema是一个在跨多个环境的版本控制中管理schema更改的杰出开源解决方案

8.7. gh-ost是由GitHub的数据工程团队创建的,专门作为一种管理schema更改过程的解决方案,既不影响服务,也不使用触发器

8.7.1. 其使用的是二进制日志而不是触发跟踪变化,这是更安全的选择,所以不必担心触发器的性能影响

刚入职,软件测试岗,有点迷茫不知道下一步怎么提升自己 软件测试前景和发展都是不错,已经入了软件测试这行业就坚挺下去 阅读详情

相关推荐

centos7下安装gcc-10.3.0

生成多个系统版本的代码,如果你的操作系统是32位,默认就已经设置为 disable,这时gcc仅能生成32位的可执行程序;这里只开启了c,c++ 和fortran,因为支持的语言越多,就需要安装越多的相应静态与动态库,还有五花八门的依赖库,这会让管理变得困难,体积也会变得庞大。启用posix标准的线程支持,这个设置取决于宿主或目标操作系统的类型,其它可用值有:aix,dec,solaris,win32等,如果你是其它的类UNIX系统,就需要设置相应的值。指定安装路径,这里没有指定,就直接放到文件夹里就好。

lxystar2003的博客 1189

浅谈《高性能MySQL》之“创建高性能索引“

《高性能mysql(第3版)》是mysql 领域的经典之作,拥有广泛的影响力。第3 版更新了大量的内容,不但涵盖了最新mysql 5.5版本的新特性,也讲述了关于固态盘、高可扩展性设计和云计算环境下的数据库相关的新内容,原有的基准测试和性能优化部分也做了大量的扩展和补充。全书共分为16 章和6 个附录,内容涵盖mysql 架构和历史,基准测试和性能剖析,数据库软硬件性能优化,复制、备份和恢复,高可用与高可扩展性,以及云端的mysql 和mysql相关工具等方面的内容。每一章都是相对独立的主题,读者可以有选择

lulu147的专栏 415

基于TL431与MOSFET的高效过压保护电路设计详解

本文详细解析了基于TL431与MOSFET的高效过压保护电路设计。通过TL431精准监测电压,驱动MOSFET作为主开关,实现快速可靠的电源保护。文章涵盖电路原理、参数计算、性能优化及实战调试要点,为电子设备提供了一套经典且成本低廉的过压保护解决方案。

weixin_29215391的博客 771

读高性能MySQL(第4版)笔记21_读后总结与感想兼导读

总结与感想和导读

lyingSeven的博客 996

微信小游戏审核避坑指南:如何一次性通过微信审核(附最新审核要求)

本文详细解析微信小游戏审核全流程,提供从开发到上线的关键策略,帮助开发者一次性通过审核。涵盖合规性自查、材料优化、开发环境配置、版本管理、审核材料填写技巧等核心内容,并附最新审核要求和常见驳回问题解决方案,显著提升审核通过率。

weixin_28454475的博客 1402

AI计算,为什么要用GPU?

几年后,2012年,神经网络之父杰弗里·辛顿(Geoffrey Hinton)的两个学生——亚历克斯·克里切夫斯基(Alex Krizhevsky)、伊利亚·苏茨克沃(Ilya Sutskever),利用“深度学习+GPU”的方案,提出了深度神经网络AlexNet,将识别成功率从74%提升到85%,一举赢得Image Net挑战赛的冠军。根据形态,GPU可分为独立GPU(dGPU,discrete/dedicated GPU)和集成GPU(iGPU,integrated GPU),也就是常说的独显、集显。

经营范围: CTA、SRRC、CCC、移动、电信、联通入库 1674

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

优化数据类型

lyingSeven的博客 457

网络工程师教程第6版(2024年最新版)

本书 根据《网络工程师考试大纲》(2024年审定通过)编写,对网络工程师岗位所要求的主要知 识及应用技术进行了阐述。本书主要内容包括数据通信、局域网、无线通信网、网络互连、网络安全、网络操作系统与应用服务器、组网技术、网络管理、网络规划和设计。本书是参加网络工程师考试的必备教材,也可作为网络工程从业人员学习网络技术的教材或日常工作的参考用书。王涛和严体华编写了第2章、第3章和第4章;网络工程师教程(第6版)由清华大学出版社出版,由工业和信息化部教育与考试中心组编,张永刚、王涛、高振江任主编,具体介绍如下。

鹿鸣天涯 6901

《高性能MySQL》 夯实之路(二) Schema与数据类型优化

来说,修改表的结构原来需要很长时间,因为需要创建一个新表,再把所有的数据复制过去。MySQL并不原生支持物化视图,而是由第三方实现,如Flexviews。把所有计数器放在同一个表里。:每个事实数据只会出现。的,可以出现在多个地方。

weixin_46644228的博客 976

7.18 GART 与 GPUVM 对比:一颗 GPU 上两套页表的分工

本文横向对比AMD GPU上并存的GART与GPUVM两套页表。GART为内核专用,全局单一,线性单层结构,CPU同步直写;GPUVM为每进程48位地址空间,四级页表,含并发状态机,支持隔离与迁移。二者通过VMID区分,共享GMC硬件与PTE编码,分工互补。

图形/计算GPU的驱动与虚拟化技术分享园地 377

LearningToRank(LTR)排序算法LGBMRanker的原理和使用

1. 写在前面 在最近新闻推荐的比赛中, 接触到了一个排序模型LGBMRanker, 该模型与普通的分类模型LGBMClassifier不太一样, 普通的分类模型在进行推荐的时候, 往往是先预测某个商品或者文章用户会不会点击, 也就是它的目标是预测用户点击某篇文章或者某个商品的概率, 然后根据这个概率值进行排序, 排完之后,把最靠前的几个返回回来给用户进行推荐。 而LGBRanker模型, 它不关心用户点击某篇文章的概率, 而是根据用户点击或者不点击的这个行为, 直接去预测最后商品或者文章的一个相对顺序,

Miracle8070 1万+

高性能MySQL笔记

Mysql

C/C++ 1220

6、探索音乐结构中的统一性:贝多芬《英雄交响曲》第一乐章的深度剖析

本文深入剖析了贝多芬《英雄交响曲》第一乐章的音乐结构,探讨其统一性的来源及表现形式。通过主题与动机、和声与调性、旋律与节奏、织体与动态等多方面的分析,揭示了这部作品在技术层面和情感表达上的卓越成就。

b9c0d的博客 518

《高性能MySQL》——Schema与数据类型优化(笔记)

Schema与数据类型优化部分

weixin_46949627的博客 1330

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

高性能MySQL 第4版

Performance Schema同了有关MySQL服务器内部运行的操作上的底层指标。Performance Schema有两个概念:程序插桩:程序插桩在MySQL代码中插入探测代码,以获取我么你想了解的信息。消费者表:指存储关于程序插桩代码信息的表。如果我们为查询模块添加插桩,相应的消费者表将记录诸如执行总数、未使用索引的次数、花费的时间等信息。消费者表是插桩发送信息的目的地。

xx先森 1344

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

读高性能MySQL(第4版)笔记01_MySQL架构(上)

1.逻辑架构 1.1.大多数基于网络的客户端/服务器工具或服务器都有类似的服务 1.1.1.连接处理 1.1.2.身份验证 1.1.3.确保安全性 1.2.核心层 1.2.1.查询解析、分析、优化、以及所有的内置函数 1.2.2.跨存储引擎的功能 1.2.2.1.存储过程 1.2.2.2.触发器 1.2.2.3.视图 1.3.存储引擎层 1.3.1.存储引擎负责MySQL中数据的存储和提取 1.3.2.和GNU/Linux下的各种文件系统一样,每种存

1186

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

高质量解读《高性能mysql》——第4章Schema与数据类型优化

前言: 高效读书,一张逻辑图带你读懂、读薄书中重点。 深入学习MySQL系列,解读的目的是为了把书读薄,抽出重点进行梳理、理解、运用。因大量文字很容易让人觉得枯燥无味,为此博主花费一定精力和时间整理输出为逻辑思维图,以便大家学习和参考。 -------------------------------------------------------------------------------------- 注:下面文字只是对逻辑思维图的”翻译“,节省时间,只看图即可。 Schema与数据类型..

天天water的专栏 5666

MySQL8.0优化 - 优化MySQL服务器、优化MySQL的参数、优化数据类型

MySQL8.0优化 - 优化MySQL服务器、优化MySQL的参数、优化数据类型

小草的博客 5328

高性能MySQL笔记之数据类型和scheme优化

一、数据类型优化 整体原则: 1.小的通常更好:在满足需求的前提下,尽量选择占用存储空间小的类型 2.简单就好:简单数据类型往往只需要更短的CPU周期,同时也可以减小数据库在运算时的压力 3.尽量避免使用NULL,尤其是有索引的情况下 数值类型 1.整数类型 在mysql中,整数类型一共分为五种,分别是tinyint(8)、smallint(16)、mediumint

lj_gambler的博客 1310

读高性能MySQL(第4版)笔记12_查询性能优化(下)

原创作者: ratelcloud 转载于: https://blog.51cto.com/ratelcloud/...

weixin_40673426的博客 49

探索 MySQL 性能优化的智慧宝库 ——《高性能 MySQL(第 3 版)》

高性能 MySQL(第 3 版)》作为 MySQL 性能优化领域的经典著作,以其全面而深入的内容,为读者提供了系统学习 MySQL 性能优化的平台。无论是数据库设计、查询优化、索引优化,还是存储引擎的选择与调优,书中都给出了详细的理论阐述和实践指导。通过阅读这本书,开发者和数据库管理员不仅可以掌握 MySQL 性能优化的核心技术,还能够培养解决实际问题的能力。

数字魔方操控师的博客 1055

《高性能MySQL》笔记——MySQL建表数据类型的选择

ZT:https://www.cnblogs.com/woods1815/p/9926330.html 前段时间看了《高性能MySQL》中的选择优化的数据类型,这里主要是做一下笔记。 首先数据选择有几个简单原则: 更小的通常更好。一般情况下,应该尽量使用可以正确存储数据的最小数据类型。例如只需要存 0~200,tinyint unsigned 更好。更小的数据类型通常更快,因为它们占用更少...

起风了 537

读高性能MySQL笔记

1.1 MySQL逻辑架构         MySql服务器逻辑架构图 1、连接管理与安全性 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建或者销毁线程。 当客户端(应用)连接到MySQL服务器时,服务器需要对其进行认证。认证基于用户名、原始主...

weixin_33858485的博客 280

《高性能Mysql》读书笔记之Schema与数据类型优化

一、选择优化的数据类型 原则 使用可以正确存储的最小数据类型 小的数据类型占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少 选择简单的数据类型 简单的数据类型通常需要更少的CPU周期,整数比字符操作代价更低 尽量避免NULL 通常情况下最好设置指定列为NOT NULL,除非真的需要存储NULL值 NULL会使用更多的存储空间,再MYSQL中需要特殊处理 当可为...

程序员朱永胜 2080

高性能mysql笔记—字段篇

最近在读高性能mysql这本书,这一系列文章只为读书笔记选择最优的数据类型            1)更小的通常更好                  一般情况下,应该尽量使用可以存储数据的最小数据类型。更小的数据类型通常更快,因为它们占用更小的磁盘空间、内存和cpu缓存,并且处理时需要的cpu周期也更少。            2)简单就好                    简单数据类型的操...

无一物的博客 2300

高性能MySQL读书笔记 (三)

特殊类型:书中举例,ip地址应该用无符号整数存储,MySQL提供inet_aton, inet_ntoa方法转换。MySQL中,存储引擎先在索引中找到对应值根据匹配的索引记录找到对应的数据行.索引在存储引擎层实现。避免使用Null: 含有Null列会使索引,索引统计和值更为复杂。业务上有时需要一张完全独立的汇总表或缓存表主要用于满足检索的需求。分配空间: 根据实际需要分配.使用内存临时表或操作时会比较糟糕。索引是存储引擎用于快速查找记录的数据结构。更小: 选择不超过需求范围的最小类型。

929
上一篇: 读高性能MySQL(第4版)笔记06_优化数据类型(上)
下一篇: 读高性能MySQL(第4版)笔记08_创建高性能索引(上)
躺柒
博客等级 码龄4年 7004粉丝 1317原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值