抽空整理了一下MySQL中的Schema与数据类型优化相关的知识点,有点零碎。MySQL的数据类型相对来说比Oracle的数据类型要多,所以,MySQL使用起来也会相对更加灵活一些。在数据存储管理方面,MySQL的使用者可以根据自己的需求更容易找到可以满足业务场景同时又最节省磁盘空间的数据类型。另外MySQL还有一点优势在于,MySQL支持主键自增,而Oracle并不支持,在Oracle实现主键自增需要额外定义触发器,会麻烦很多。
1、NULL表示可为空值。尽量避免使用NULL。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理。当可为NULL的列被索引时,每个索引记录需要一个额外的字节。
2、整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。
3、UNSIGN表示不允许负值。
4、MySQL可以为整数类型指定宽度,但是不会限制值的合法范围,只是规定了MySQL的一些交互工具用来显示字符的个数。
5、实数类型是带有小数的数字。
6、FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算。
7、BIGDECIMAL类型用于存储精确的小数。
8、只有在需要对小数进行精确计算时才使用DECIMAL。在数据量比较大的时候,可以考虑使用BIGINT代替DECIMAL,将需要存储的数据根据小数的位数乘以相应的倍数即可。
9、VARCHAR类型用于存储可变长度字符串。
10、VARCHAR需要使用1或2个额外字节记录字符串的长度(依据列的最大长度和255字节的大小关系)。
11、CHAR类型存储定长的字符串。
12、CHAR适合存储很短的字符串,或者所有值都接近同一个长度。
13、使用VARCHAR(5)和VARCHAR(200)存储’hello’的空间开销是一样的。但是,VARCHAR会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内存值。在使用内存临时表和磁盘临时表进行排序时,性能会下降。
14、BLOB和TEXT是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。
15、把一些不重复的字符串存储成一个预定义的集合。
16、DATETIME:保存更大范围的日期,从1001年到9999年,精度为秒。
17、TIMESTAMP:从1970年1月1日午夜以来的秒数。从1970年到2038年。
18、可以使用BIGNINT类型存储微妙级别的时间戳,或者使用DOUBLE存储秒之后的小数部分。
19、MySQL中的紧凑的位存储数据:BIT和SET。都是字符串类型。
20、可以使用BIT列在一列中存储一个或多个true/false值。
21、SET:如果需要保存很多true/false值,可以考虑合并这些列到一个SET数据类型,以一系列打包的位集合来表示。
22、用无符号整数存储IP地址。
1、在范式化的数据库中,每个事实数据会出现并且只出现一次。在反范式化的数据库中,信息时冗余的,可能会存储在多个地方。
2、范式的优点:
(1)更新操作比反范式化要快。
(2)只有很少或者没有重复数据,只需要修改更少的数据。
(3)表通常更小,可以更好地放在内存中,执行操作更快。
(4)更少需要DISTINCT或者GROUP BY语句。
范式的缺点:需要关联。
3、反范式的优点和缺点与范式化相反。
4、在实际应用中经常需要混用范式化和反范式化。
5、最常见的反范式化的方法是复制或者缓存,在不同的表中存储相同的特定列。
6、关于schema的定义:
Conceptually, a schema is a set of interrelated database objects, such as tables, table columns, data types of the columns, indexes, foreign keys, and so on.
In MySQL, physically, a schema is synonymous with adatabase. You can substitute the keyword SCHEMA instead of DATABASE in MySQL SQL syntax, for example using CREATE SCHEMA instead of CREATE DATABASE.
1、缓存表表示存储那些可以比较简单地从schema其他表获取数据的表。
2、汇总表保存的是使用GROUP BY语句聚合数据的表。
3、实时计算统计值是很昂贵的操作。
4、缓存表对优化搜索和检索查询语句很有效。
5、物化视图是预先计算并存储在磁盘上的表,可以通过各种各样的策略刷新和更新。
6、计数器表:可以用这种表缓存一个用户的朋友数、文件下载次数等。直接在表中保存计数器可能会碰到并发问题。
7、更快地读,更慢地写。为了提升度查询的速度,经常会需要建一些额外索引,增加冗余列,甚至是创建缓存表和汇总表。这些方法会增加写查询的负担,也需要额外的维护任务。