第四章-shceme和数据类型优化

选择数据类型的原则:

1.更小通常更好。因为占用更少磁盘,内存和cpu缓存。但是要确保没有低估,因为进行alter时,是很耗时和头疼的操作。所以当无法确定数据类型的时候,选择不会超过范围的最小类型。

2.简单就好。简单的数据类型消耗的cpu更好,比如整型比字符串好

3.尽量避免使用null。主要是因为mysql的内部实现问题,但这种优化一般效益比较小。

Decimal 的缺点:

1.占用内存多

2.计算消耗的cpu多 所以不到必须情况最好不要使用。一种优化方法是对decimal乘以一定的量级,然后用bigint对数据进行存储

Varchar 和 char

Varchar 是不定长的,所以一般比char省空间,但是如果这个字段频繁被更新,可能会导致内存碎片。所以如果数据的长度比较大,而且更新很少,推荐使用这个。

Char是定长的,适合短小的数据,可以频繁更新。

和varchar char类似的数据还有binary,varbinary。binary是使用字节码进行存储,在做比较运算的时候比char快。

blob和txt

Blob和text的区别是,blob存储的是二进制数据,text存储的是文本。当数据太大的时候,可能会在一块专门的区域对他们进行存储,在数据表中存放指针。如果在这类数据类型上建立索引,一般只在前面一小部分的字符进行建立索引。可以使用max_sort_length进行设置。

enum

枚举在表中的存储占用的内存很小,在表中存储的是枚举的数字,如果使用字符和枚举进行匹配,会有映射操作的存在,比较消耗性能。另外,向枚举中添加成员会比较头疼,所以使用的时候要谨慎。

时间类型

Datetime 保存的时间的范围比较大,占用内存也多,和时区无关

Timestamp 保存的时间范围很小,占用内存是Datetime的一半,可以根据时区进行自动转换。timestamp列默认是not null,然后可以配置自动更新。

Mysql目前无法存储精确到秒级别的数据类型,所以需要想别的办法。

位类型

位数据类型 mysql把bit当做字符串类型来存储,所以检索的时候,读出来的是字符串的0或1,而不是ASCII码的0或1.但是在数字上下文的场景中,mysql会把字符串转换成数字。

SET是一系列打包bit的集合。

选择标识符

选择标识符 标识列可能被用来和别的列做比较(比如关联查询中),或者通过标识列来寻找其他列。所以选择标识列的数据类型最好选用执行计算效率高的数据类型,还要确保在做列比较的时候,是使用相同类型的列进行比较,否则做类型转换会带来开销,或者错误。整数类型的性能很好。

mysql scheme的陷阱:

1.巨宽的表。在mysql中,在查询时,需要对行数据进行转换,如果列太多,会消耗很多的性能。

2.太多的表关联。mysql限制了每个关联操作最多只能有61张表。而且关联表太多,会很消耗性能。

3.滥用枚举。一个是枚举用来比较时性能不好,另外,对枚举进行修改时需要alter。

范式和反范式:

范式的讲解:https://i.cnblogs.com/PostDone.aspx?postid=9057094&actiontip=保存修改成功

范式的优点和缺点:

1.范式的更新操作通常比反范式快

2.如果进行了很好的范式化,就很少有重复的数据,所以修改的时候只需修改很少的数据

3.范式化的表通常更好,可以更好的放到内存里

4.很少有多余的数据,意味着查询的时候会更少的需要distinct或者group by

-1.范式化的设计,在查询的时候,需要做很多的关联

-2.做关联价格比较昂贵,而且可能使一些聚簇索引失效

反范式的优点和缺点:

1.做一些数据的冗余,可以很好的避免关联

2.如果不需要关联表,即使在查询的时候没有使用索引,进行全表扫描,也是顺序IO,不会造成随机IO。

3.单独的表,可能会有更有效的索引。

完全的范式和反范式都是实验室里才有的东西,在现实里,经常会混用范式和反范式,缓存表,以及其它技巧。

缓存表和汇总表:

缓存表 表示存储那些可以从其它表中获取,但是获取速度比较慢的表。进行数据的冗余查询(逻辑上的冗余)。在缓存表中,可以设置一些特殊的索引,来满足一些查询的需要。

汇总表 保存的是使用group by语句聚合数据的表(例如:数据不是逻辑上的冗余)例如,想要得到表中的行数,但是每次都这样查询的话会比较慢,就在另外一个表中,每隔一段时间进行一次统计。

维护缓存表和汇总表的俩种方式:1.定期重建 2.实时维护

影子表:在更新表的时候,同时更新影子表。 需要做表切换的时候,直接对表进行重命名。

计数器表:

1.计数器表有一行数据,然后更新这行数据的数值。

2.为了增加并发,可以创建多行数据,随机的更新哪一行,然后把这些行的数据加起来,就是总数。

加快alter的速度的方法:

1. 在从库上,先不提供服务,然后进行alter操作,然后进行主从切换

2. 创建一个新表,进行数据备份,然后进行影子切换

其他方法感觉不太会用到,暂不介绍。

Ps:以下内容摘自帅哥的wiki

表设计与字段设计的最佳实践

库表设计

(1)将?字段、访问频率低的字段拆分到单独的表中存储,分离冷热数据。

(2)推荐使?HASH进?散表,表名后缀使??进制数,数字必须从0开始。

(3)按?期时间分表需符合YYYY[MM][DD][HH]格式,例如2013071601。年份必须?4位数字表?。例如按?散表user_20110209、 按月散表user_201102。

(4)采?合适的分库分表策略。例如千库?表、?库百表等。

字段设计

(1)建议使?UNSIGNED存储?负数值。

(2)建议使?INT UNSIGNED存储IPV4。

(3)?DECIMAL代替FLOAT和DOUBLE存储精确浮点数。例如与货币、?融相关的数据。

(4)INT类型固定占?4字节存储,例如INT(4)仅代表显?字符宽度为4位,不代表存储?度。

(5)区分使?TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT数据类型。例如取值范围为0-80时,使?TINYINT UNSIGNED。

(6)强烈建议使?TINYINT来代替ENUM类型。

(7)尽可能不使?TEXT、BLOB类型。

(8)禁?在数据库中存储明?密码。

(9)使?VARBINARY存储??写敏感的变?字符串或?进制内容。

(10)使?尽可能?的VARCHAR字段。VARCHAR(N)中的N表?字符数??字节数。

(11)区分使?DATETIME和TIMESTAMP。存储年使?YEAR类型。存储?期使?DATE类型。 存储时间(精确到秒)建议使?TIMESTAMP类型。

(12)所有字段均定义为NOT NULL。

原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/9057498.html

时间: 2024-11-09 02:59:15

第四章-shceme和数据类型优化的相关文章

第四章:Schema与数据类型优化

1. 选择优化的数据类型 选择数据类型的原则 更小的通常更好:选择可以正确存储数据的最小数据类型 小的数据类型消耗更少的内存.CPU;占用更少的磁盘 选用简单的数据类型:简单的数据类型通常需要更少的CPU周期来处理 使用MySQL内建的类型来存储时间和日期 使用整型存储IP地址 尽量避免null值:通常情況下使用not null,除非真的需要存出null值 null值使得索引.索引統計.值比較都变得复杂 可为null的列需要更多的空间来存储 InnoBD使用单独的bit来存储null值 数字分为

高性能MySQL(四)—Schema与数据类型优化(1)

Schema与数据类型优化 选择优化的数据类型 下面是一些简单的原则: 更小的通常更好 一般情况下,应该尽量使用可以正确存储的最小数据类型.如:只需要存储0-200, tinyint unsigned就比较好.小的数据类型占的磁盘.内存和CPU缓存都较少,并且处理时需要的CPU周期数也更少. 简单就好 简单数据类型额操作通常需要更少的CPU周期.如:应该使用MySQL的內建类型来存储时间和日期而不是字符串.如:应该用整型存储IP地址. 尽量避免null 通常情况下最好指定列为NOT NULL,除

高性能MySQL笔记 第4章 Schema与数据类型优化

4.1 选择优化的数据类型   通用原则 更小的通常更好 前提是要确保没有低估需要存储的值范围:因为它占用更少的磁盘.内存.CPU缓存,并且处理时需要的CPU周期也更少. 简单就好 简单数据类型的操作需要更少的CPU周期. 尽量避免NULL 值可为NULL的列使得索引.索引统计和值比较都更复杂化.可为NULL的列会使用更多的存储空间. 整数类型 TINYINT SMALLINT MEDIUMINT INT BIGINT.分别使用8,16,24,32,64位存储空间.他们可以存储的值的范围从 -2

第04章 Schema与数据类型优化

反范式的设计可以加快某些类型的查询,但也可能是的另一些类型的查询变慢.添加计数表和汇总表是一种很好的优化查询的方式. 1 选择合适的数据类型 通常原则是: 更小的通常更好:一般情况下应该尽量使用可以正确存储数据的最小数据类型.更小的数据类型通常更快,因为他们占用很少的磁盘,内存和cpu缓存,在处理的时候需要的cpu周期也更少. 简单就好:简单数据类型的操作通常用更少的cpu周期.比如整数比字符操作代价低,因为字符集和校对规则使得字符比整形更复杂.比如,mysql使用內建类型来存储时间和日期,而不

高性能mysql 第4章 Schema与数据类型优化

基本原则: 更小的通常更好:占用更少的磁盘 内存和cpu缓存. 简单就好:比如整形比字符型代价更低.使用日期型来存储日期而不是字符串.使用整形存储ip地址. 尽量避免null:如果可以 加上not null约束.因为可以null的列使索引,索引统计,值比较都变得复杂.通常把可为null的列改为not null带来的性能提升比较小,调优时没有必要首先修正这种情况来排查问题.但是如果计划在列上建立索引,如果可以保证是not null,那么尽量加上. 整数类型: tinyint,smallint.,m

高性能MySql-Schema与数据类型优化1

高性能MySql阅读笔记第四章--Schema与数据类型优化阅读笔记 良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema,这往往需要权衡各种因素. 本章主要为接下来的索引优化与查询优化做铺垫,覆盖了MySql特有的schem设计方面的主题: 一.选择优化的数据类型 Mysql支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.在为列选择数据类型时,第一步需要确定合适的大类型,下一步是选择具体类型相同大类型下的不同子类型数据有时也有一些特殊的行为和

【MySQL】《高性能MySQL》学习笔记,第四章,Schema与数据类型优化

[MySQL]<高性能MySQL>学习笔记,第四章,Schema与数据类型优化 良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema. 反范式的设计可以加快某些类型的查询,单同时可能使另一类型的查询变慢,比如添加计数表和汇总表是一种很好的优化查询的方式,但这些表的维护成本可能会很高. 1.选择优化的数据类型 更小的通常更好. ? 应该尽量使用可以正确存储数据的最小类型,更小的数据类型通常更快,因为他们占用更少的磁盘,内存和CPU缓存,并且处理时需要的CPU周

OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围

OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)   所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符.变量在声明的时候首先要标明类型,后边可以跟多个变量,之间用逗号隔开.很多情况下,变量在声明的时候可以使用等号“=”进行初始化. 用户定义类型可以使用struct,在结构体中所有变量类型都必须是OpenGL ES着色器语言定义的关键字.OpenGL ES着色语言是类型安全的,因此不支持隐式类型转换.

OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)

OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章) 4.5精度和精度修饰符 4.5.1范围和精度 用于存储和展示浮点数.整数变量的范围和精度依赖于数值的源(varying,uniform,纹理查找,等等),是不是顶点或者片元着色器,还有其他一些底层实现的细节.最低存储需要通过精度修饰符来声明.典型地,精度操作必须要保留变量包含的精度存储.仅有的例外是需要大量复杂计算的内建函数,如atan(),返回值的精度低于声明的精度. 强烈建议顶点语言提供一种匹配IEEE单精度浮点数或更高精