良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema。缓存
1、选择优化的数据类型性能
选择数据类型的原则优化
一、更小的一般更好spa
通常状况下,应该尽可能使用能够正确存储数据的最小数据类型。更小的数据类型一般更快,由于它们占用更小的磁盘、内存和CPU缓存,而且处理时须要的CPU周期也更少。设计
二、简单就好排序
简单数据类型的操做一般须要更少的CPU周期。索引
三、尽可能避免NULL内存
查询中包含可为NULL的列对MYSQL来讲更难优化,由于可为NULL的列使得索引、索引统计和值比较都更复杂。字符串
整数类型class
若是存储整数,可使用这几种整数类型:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT分别使用8, 16, 24, 32, 64位存储空间。整数类型有可选的UNSIGNED属性,表示不容许负值,这大体可使正数的上限提升一倍。有符号和无符号类型使用相同的存储空间,并具备相同的性能,所以能够根据实际状况 选择合适的类型。
实数类型
实数是带有小数部分的数字。然而,它们不仅是为了存储小数部分、也可以使用 DECIMAL存储比BIGINT还大的整数。MySQL既支持精确类型,也支持不精确类型。
FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算。
DECIMAL类型用于存储精确的小数。
浮点类型在存储一样范围的值时,一般比DECIMAL使用更少的空间。FLOAT使用4个字 节存储。DOUBLE占用8个字节,相比FLOAT有更高的精度和更大的范围。
字符串类型
VARCHAR和CHAR类型
VARCHAR和CHAR是两种最主要的字符串类型。
VARCHAR类型用于存储可变长字符串,是最多见的字符串数据类型。它比定长类型 更节省空间,由于它仅使用必要的空间(例如,越短的字符串使用越少的空间)。
CHAR类型是定长的:MySQL老是根据定义的字符串长度分配足够的空间。CHAR适合存储很短的字符串,或者全部值都接近同一个长度。
BLOB和TEXT类型
BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。
日期和时间类型
DATETIME
这个类型能保存大范围的值,从1001年到9999年,精度为秒。它把日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,与时区无关。使用8个字节的存储空间。
TIMESTAMP
TIMETAMP类型保存了从1970年1月1日午夜(格林尼治标准时间)以来的秒数,它和UNIX时间戳相同。TIMESTAMP只使用4个字节的存储空间。
2、范式与反范式
范式的优势和缺点
优势:
范式化的更新操做一般比反范式化要快。
当数据较好地范式化时,就只有不多或者没有重复数据,因此只须要修改更少的数据。
范式化的表一般更小,能够更好地放在内存里,因此执行操做会更快。
缺点:
范式化设计的schema的缺点是一般须要关联。稍微复杂一些的査询语句在符合范式的 schema上均可能须要至少一次关联,也许更多。
反范式的优势和缺点
优势:
反范式化的schema由于全部数据都在一张表中,能够很好地避免关联。
能够设计有效的索引。
缺点:
表中的数据冗余较多,删除数据时候会形成表有些有用的信息丢失。
混用范式化和反范式化
事实是,彻底的范式化和彻底的反范式化schema都是实验室里才有的东西:在真实 世界中不多会这么极端地使用。在实际应用中常常须要混用,可能使用部分范式化的 schema、缓存表,以及其余技巧。
最多见的反范式化数据的方法是复制或者缓存,在不一样的表中存储相同的特定列。
3、缓存表和汇总表
缓存表表示存储那些能够比较简单地从schema其余表获取(可是每次获取的速度比较慢)数据的表(例如, 逻辑上冗余的数据)。
汇总表表示那些使用GROUP BY语句聚合数据的表(例 如,数据不是逻辑上冗余的)。
4、schema设计原则
- 尽可能避免过分设计,例如会致使极其复杂査询的schema设计,或者有不少列的表设 计(不少的意思是介于有点多和很是多之间)。
- 使用小而简单的合适数据类型,除非真实数据模型中有确切的须要,不然应该尽量地避免使用NULL值。
- 尽可能使用相同的数据类型存储类似或相关的值,尤为是要在关联条件中使用的列。
- 注意可变长字符串,其在临时表和排序时可能致使悲观的按最大长度分配内存。
- 尽可能使用整型定义标识列。
- 避免使用MySQL已经遗弃的特性,例如指定浮点数的精度,或者整数的显示宽度。
- 当心使用ENUM和SET。虽然它们用起来很方便,可是不要滥用,不然有时候会变成 陷阱。最好避免使用BIT.