标签:插入 进制 字符串长度 就会 过程 rom 显示 并且 性能提升
选择数据类型的原则
数字分为:整数和实数
整数可以用:TINYINT、SMALLINT、INT、BIGINT类型来存储,分别占用8、16、24、32、64位的存储空间. 使用UNSIGNED属性标识整数,表示不可为负:
MySQL可以为整数类型指定宽度,例如INT(11),对于大多数应用是没有意义的,他不会限制值的合法范围,只是规定了MySQL的客户端来显示字符的个数,对于存储来说INT(11)和INT(20)占用的空间是相同的.
实数是带有小数部分的数字,实数类型也不一定是用来存小数,可以用decimal来存储比bigint还大的整数.
MySQL既支持精确类型也支持不精确类型:
许多方法可以指定浮点列的精度,这样MySQL会悄悄使用不同的数据类型,或者在存储时进行取舍,因此建议只指定数据类型而不指定精度.鉴于空间和计算开销,应该只在对小数进行计算的场景下才使用decimal.
MySQL支持多种字符串类型,每种类型还有很多变种.
varchar和char是两种主要的字符串数据类型,这两种数据类型的存储方式和存储引擎有关.
blob和text是MySQL为很长的字符串设计的类型,分别采用二进制和字符串来存储.
数据过长是,这两个类型在Innodb引擎中使用外部区域来存储,在行内使用1-4字节的指针指向这个外部区域.
mysql>create table enum_test(
e ENUM('fish','apple','dog')not null
);
mysql> insert into enum_test(e)values('fish','dog','apple');
这三行数据实际上存储为整数:
mysql> select e+0 from enum_test;
+---+
|e+0|
+---+
| 1|
| 3|
| 2|
+---+
使用美剧不好的地方在与字符串列表时固定的,需要修改时必须将表删了重建.
某些情况下,char/varchar和枚举列关联会导致性能下降.
MySQL能存储的最小时间单位是秒,但是也可以使用微秒级别的粒度进行临时运算.
此外,可以用bigint来保存更小粒度的时间值
? MySQL之后少数的类型使用位来存储数据,例如bit和set而不管底层储存格式和方式如何,从技术上来说都是字符串.
标识列可能被用来与其他列比较,或者通过标识列寻找其他列,标识列也可能被用在外键.
在满足值的范围,并且保证未来的增长空间时应选择最小的 数据类型来作为标识列的类型:
太多的列
太多的关联
全能的枚举
变相的枚举
集合set列允许一个或者多个值,这时候容易混乱:
create table ...(is_default set('Y','N') not null default'N');
如果这里真假两种情况不会同时出现,那么使用枚举会更加合适.
在范式化的数据库中所有数据出现且仅出现一次,而反范式的数据中,每个事实数据可能会出现多次,信息冗余.
写密集型的表按照范式规范设计性能会更好!
反范式的数据都在一张表中,可以很好的避免关联.
如果不需要关联,则针对大部分查询慢(即使没有索引)需要全表扫描,那么当数据比内存大时全表扫描可能要比关联快很多.
最常见的反范式化设计是复制或者缓存,在不同的表中存储相同的某个列.
MySQL5.0之后可以用触发器更新缓存.
有时候提升性能最好的方法是在表中保存一写衍生的冗余的数据,但在某些时候,也需要创建一张完全的汇总表或者缓存表.
缓存表:可以比较简单的从schema中其他表中获取(每次获取速度表较慢)数据的表(逻辑上冗余的表)
汇总表:保存的是使用group by语句聚合数据的表(不是逻辑上冗余的数据).
- 尽量避免过度设计
- 使用小和简单的合适数据类型,尽量避免使用null值
- 尽量使用相同的数据类型存储相似或者相关的列,尤其是关联条件中的列
- 注意可变长字符串
- 尽量使用整型定义标识列
- 避免使用MySQL已经遗弃的特性
- 小心的使用枚举和set,最好避免使用bit
- 范式是好的,但是很多时候反范式也是有必要的,这回带来好处
标签:插入 进制 字符串长度 就会 过程 rom 显示 并且 性能提升
原文地址:https://www.cnblogs.com/mydailycoding/p/12348326.html