mysql 数据类型 高性能mysql笔记

本文探讨了MySQL性能优化的关键策略,包括合理选择数据类型、避免过多的列和关联、处理NULL值等,强调了范式化与反范式化的优缺点,以及如何平衡读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.选择优化的数据类型

更小的通常更好。

​ 应该尽量使用可以正确存储数据的最小类型,更小的数据类型通常更快,因为他们占用更少的磁盘,内存和CPU缓存,并且处理时需要的CPU周期更少。

简单就好

​ 更简单的数据类型的操作通常需要更少的CPU周期。例如,整型数字比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较相对整型数字比较更复杂。比如,应使用INTERGER存储IP地址(inet_aton)

尽量避免NULL

​ 通常情况下,最好指定列为NOT NULL。如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引,索引统计和值比较非常复杂,可为NULL的列会使用更多的存储空间,当可为NULL的列被索引时,每个索引记录需要一个额外的字节。但是把可为NULL的列改成NOT NULL带来的性能提升比较小,但如果计划在列上创建索引,就应该避免设计成可为NULL的列。

1.1整数类型

整数类型占用空间范围
TINYINT8[-2^7,2^7-1]
SMALLINT16[-2^15,2^15-1]
MEDIUMINT24[-2^23,2^23-1]
INT32[-2^31,2^31-1]
BIGINT64[-2^63,2^63-1]

整型类型有可选的UNSIGNED属性,表示不允许负值,可以使原本正数的上线提高一倍。有符号和无符号类型使用相同的存储空间,并具有相同的性能。整型之间相互计算,是以64位的BIGINT作为中间类型进行计算的。

1.2实数类型

实数是带有小数部分的数字,可以使用DECIMAL存储比BIGINT还大的整数。

DECIMAL类型用于存储精确的小数,支持精确计算。例如,DECIMAL(18,9)小数点两边将各存储9个数字,一共使用9个字节,其中小数点前面的数字使用。DECIMAL最多允许65个数字。

浮点类型在存储同样范围的值时,通常比DECIMAL占用更少的空间,内部计算时采用DOUBLE作为计算类型。

因为需要额外的空间和计算开销,尽量只在对小鼠进行精确计算时才使用DECIMAL,在数据量比较大的时候,可以考虑使用BIGINT代替DECIMAL,讲需要存储的货币单位根据小数的位数乘以相应的倍数即可。

1.3字符串类型

varchar

​ varchar类型用于存储可变长字符串,比定长更节省空间,varchar需要使用1个或2个额外字节记录字符串的长度,如果列的最大长度小于或等于255个字节,则只是用1个字节表示,否则使用2个字节。varchar节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,如果在UPDATE时增加了该边长列的实际存储长度,这就导致需要额外的工作,如果一个行占用的空间增长,并且在页内没有更多的存储空间可以存储,在这种情况下,InnoDB需要分裂页来使行可以放进页内。

​ varchar使用场合:1.字符串列的最大长度比平均长度大很多,列的更新很少

​ 2.使用了UTF-8这种复合的字符集(每个字符都使用不同的字节数存储)

​ MySQL在存储和检索时会保留varchar尾部的空格。InnoDB可以把过长的VARCHAR存储为BLOB。

char

​ 定长字符串,MySQL在存储时会去除char尾部的空格。会造成“A ”与“A”产生唯一性冲突。数据如何存储取决于存储引擎,填充和截取空格的行为是在MySQL服务层进行的。

​ 更长的列会消耗更高的内存,MySQL通常会分配固定大小的内存来保存内部值,尤其是使用内存临时表进行排序或操作总是会特别糟糕。

blob

​ 采用二进制的方式存储,没有排序规则和字符集。包含tinyblob,blob,mediumblob,longblob

text

​ 采用字符串的方式存储,有排序规则和字符集,包含tinytext,text,mediumtext,longtext。

ENUM

枚举不推荐使用

注意:

  1. BLOB 是二进制数据 text是字符串数据 当二者过大时mysql会在该列保存一个1-4字节的内存地址 然后在外部存储实际的值
  2. varchar 的存储会额外多1或者2个字节存储字符串长度(字符串长度小于255字节用1)varchar的更新会产生更多碎片
  3. Char 是定长的会自动去除字符末尾空格 适合存储定长较短的更新频繁的数据如定长的Y和N (cahr类型不容易产生碎片)
  4. Varchar(10) 比varhcar(100) 在查询时使用的空间更小速度更快(查询的时候是根据varchar的大小去分配内存的) 在设置varchar大小的时候要尽可能接近真实数据不要过大

1.4日期和时间类型

日期时间类型

占用空间

日期格式

最小值

最大值

零值表示

 DATETIME

 8 bytes

 YYYY-MM-DD HH:MM:SS

 1000-01-01 00:00:00

9999-12-31 23:59:59 

0000-00-00 00:00:00

 TIMESTAMP

 4 bytes

 YYYY-MM-DD HH:MM:SS

 19700101080001

2038 年的某个时刻

00000000000000

 DATE

 4 bytes

 YYYY-MM-DD

1000-01-01 

9999-12-31 

0000-00-00

 TIME

 3 bytes

 HH:MM:SS

 -838:59:59

838:59:59 

00:00:00

 YEAR

 1 bytes

 YYYY

1901 

2155 

0000

DATETIME和TIMESTAMP

​ 现在推荐使用DATETIME,范围更大,与时区无关,占用8个字节

1.5位数据类型

​ InnoDB为每个BIT列使用一个足够存储的最小整数类型来存放,使用BIT类型并不能节省太多的存储空间,MySQL把BIT当作字符串类型,当检索BIT(1)的值时,结果是一个包含二进制0或者1的字符串。

2.MySQL 模式设计的陷阱

2.1 太多的列

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

2.2太多的关联

​ 一个粗略的经验法则,如果希望查询执行的快且并发性好,单个查询最好在12个表内做关联

2.3NULL值

​ 需要存储一个事实上的“空值”到列表中时,可以使用0,某个特殊值,或者空字符串代替。MySQL会在索引中存储NULL值,而Oracle则不会。

3.范式和反范式

​ 在范式化的数据库中,每个事实数据只会出现一次,

​ 反范式化的数据库中,信息是冗余的,可能会存储在多个地方。

3.1范式化的优点和缺点

优点:

​ 范式化的更新操作更快,只需要更改较少的数据。

​ 范式化的表更小,可以更好的放在内存里,执行操作会更快。

​ 没有多余的数据,可以减少distinct或GROUP BY的操作。

缺点:

​ 通常需要关联,关联代价昂贵,也可能使一些索引策略无效。

3.2 反范式的优点和缺点

优点:

​ 所有的数据都在一张表中,可以避免关联。

​ 不关联的时候即使全表扫描,也是顺序IO。

缺点:

​ 冗余的多余数据,更新更慢

​ 表大,放到内存中,占用大,容易挤出热数据

4.更快的读,更慢的写

​ 为了提升读查询的速度,经常会建一些额外索引,增加冗余列,甚至是创建缓存表和汇总表,这些方法会增加写查询的负担。

​ 写操作变慢并不是读操作变得更快所付出的唯一代价,还可能同时增加了读操作和写操作的并发难度。

5.加快ALTER TABLE操作的速度

​ ALTER TABLE操作对特大表来说,是个大问题。

​ MySQL执行大部分修改表结构的步骤:

​ 1.用新结构创建一个空表

​ 2.从旧表中查出所有数据插入新表

​ 3.删除旧表

​ 一般而言,大部分ALTER TABLE操作将导致MySQL服务对该表的访问中断。

​ 对于常见的场景,常见的技巧有两种:

​ 1.现在一台不提供服务的机器上执行ALTER TABLE操作,然后切换

​ 2.影子拷贝,即和原来的步骤一样,但是通过触发器的方式更新新表旧表数据,然后重命名

​ 所有的MODIFY COLUMN操作,都会导致表重建。

5.1 只修改frm(表结构)文件

​ 下面这些操作是有可能不需要重建的:

​ 移除一个列的AUTO_INCREMENT属性

​ 增加,移除,或更改ENUM和SET常量

​ 步骤(本操作是火中取栗):

​ 1.创建一张有相同结构的空表,进行所需要的修改

​ 2.执行FLUSH TABLES WITH READ LOCK。关闭所有正在使用的表,并且禁止表被打开

​ 3.交换frm文件

​ 4.执行UNLOCK TABLES来释放第二步的读锁。

6.总结

​ 1.避免设计过度复杂的数据库模式

​ 2.使用小而简单的合适数据类型,尽可能避免使用NULL值

​ 3.尽量使用相同的数据类型存储相似或者相关的值。

​ 4.可变长字符串在临时表和排序时有可能悲观的按照最大长度分配内存。

​ 5.尽量使用自增整数列定义主键

​ 6.避免使用MySQL不再推荐的特性

​ 7.谨慎对待BIT,ENUM,SET

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项误差源分析,旨在帮助工程师更好地理解应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值