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

4.1 选择优化的数据类型

 

通用原则

更小的通常更好

前提是要确保没有低估需要存储的值范围:因为它占用更少的磁盘、内存、CPU缓存,并且处理时需要的CPU周期也更少。

简单就好

简单数据类型的操作需要更少的CPU周期。

尽量避免NULL

值可为NULL的列使得索引、索引统计和值比较都更复杂化。可为NULL的列会使用更多的存储空间。

整数类型

TINYINT SMALLINT MEDIUMINT INT BIGINT。分别使用8,16,24,32,64位存储空间。他们可以存储的值的范围从 -2(N-1) 到 2(N-1)-1,其中N为存储空间的位数。

UNSIGNED 属性标识不允许负值,存储之的范围将变为0到2(N)-1。

MySQL 可以为整数类型指定宽度,例如INT(11),他不会限制值得合法范围,只是规定了MySQL的一些交互工具 用来显示字符的个数。对于存储和计算来说,INT(1)和INT(20)是相同的。

实数类型

FLOAT DOUBLE DECIMAL。

字符串类型

VARCHAR CHAR

  • VARCHAR 类型用于存储可变长字符串。
  • CHAR 类型用于存储定长字符串。非常适用于存储MD5值。
  • VARCHAR 需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在update时可能使行变得比原来更长,这就导致需要做额外的工作,不同的存储引擎的处理方式是不一样的。例如,MyISAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放进页内。

BLOB TEXT

 

  • BLOB采用二进制方式存储,没有排序规则或字符集。
  • TEXT采用字符方式存储,有字符集和排序规则。
  • TINYTEXT SMALLTEXT TEXT MEDIUMTEXT LONGTEXT,其中TEXT=SMAILLTEXT。
  • TINYBLOB SMALLBLOB BLOB MEDUIMBLOB LONGBLOB,其中BLOB=SMALLBLOB。

使用枚举(ENUM)代替字符串类型

 

枚举列把一些不重复的字符串存储成一个预定义的集合。

MySQL在内部会将每个值在集合中的位置保存为整数。

日期和时间类型

DATETIME TIMESTAMP TIME DATE YEAR

特殊类型数据

IPv4地址,MySQL提供INET_ATON() 和INET_NTOA()函数来相互转换。

4.2 MySQL schema 设计中的陷阱

  • 太多的列
  • 太多的关联:最好小于12
  • 错误使用枚举
  • 非此发明的NULL

4.3 范式和反范式

 

三大范式

 

  • 第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
  • 第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识(主键)。
  • 第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

范式的优缺点

 

优点

 

  • 范式化的更新操作通常比反范式化要快;
  • 当数据较好地范式化时,就只要很少或者没有重复数据,所以只需要修改更少的数据;
  • 范式化的表通常更小,可以更好地放在内存里,所以执行操作会更快;
  • 很少有多余的数据意味着检索列表数据时更少需要DISTINCT或者GROUP BY语句。

缺点

范式化设计的schema的缺点通常需要关联。这不但代价昂贵,也可能使一些索引策略无效。

反范式的优缺点

 

优点

  • 避免关联;

缺点

  • 冗余字段;

4.6 总结

  • 尽量避免过度设计,例如会导致极其负责查询的schema设计,或者有很多列的表的设计;
  • 使用小而简单的适合数据类型,除非真实数据模型镇南关有确切的需要,否则应该尽可能地避免使用NULL值;
  • 尽量使用相同的数据类型存储相似或相关的值,尤其是要在关联条件中使用的列;
  • 注意可变长字符串,其在临时表中排序时可能导致悲观的按最大长度分配内存;
  • 尽量使用整形定义标识列;
  • 避免使用MySQL已经遗弃的特性,例如指定浮点数的精度,后者整数的显示宽度;
  • 小心使用ENUM和SET。虽然他们用起来很方便,但是不要滥用,否则有时候会变成陷阱。最好避免使用BIT;
时间: 2024-10-10 00:36:05

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

高性能MySQL笔记-第4章Optimizing Schema and Data Types

1.Good schema design is pretty universal, but of course MySQL has special implementation details to consider. In a nutshell, it’s a good idea to keep things as small and simple as you can. MySQL likes simplicity, and so will the people who have to wo

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

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

高性能MySQL笔记-第5章Indexing for High Performance-005聚集索引

一.聚集索引介绍 1.什么是聚集索引? InnoDB’s clustered indexes actually store a B-Tree index and the rows together in the same structure. 2.为什么一张表只能一个聚集索引? When a table has a clustered index, its rows are actually stored in the index’s leaf pages.The term “clustered

高性能MySQL笔记-第5章Indexing for High Performance-003索引的作用

一. 1. 1). Indexes reduce the amount of data the server has to examine.2). Indexes help the server avoid sorting and temporary tables.3). Indexes turn random I/O into sequential I/O. Lahdenmaki and Leach’s book also introduces a three-star system for

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

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

第04章 Schema与数据类型优化

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

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

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

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

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

mysql笔记01 Schema与数据类型优化

Schema与数据类型优化 1. 选择优化的数据类型 1). 更小的通常更好:更小的数据类型通常更快,因为他们占用更少的磁盘.内存和CPU缓存,并且处理需要的CPU周期也更少. 2). 简单就好:简单的数据类型的操作通常需要更少的CPU周期.例如:整型比字符串操作的代价更低,因为字符集和校对规则(排序规则)是字符串比较比整型比较更复杂.这里有两个例子: 一个是应该使用MySQL内建的类型而不是字符串来存储日期和时间,另外一个是应该使用整型存储IP地址. 3). 避免使用null:通常情况下最好指