MySQL数据库性能优化之表结构优化
上一篇 / 下一篇 2012-05-04 11:10:27 / 个人分类:数据库
tasZ3u@&C0|0 这是MySQL数据库性能优化专题系列的第二篇文章:MySQL 数据库性能优化之表结构优化
?w8U:X&Q\l_+q051Testing软件测试网0Kd4wLY&IaE系列的第一篇文章:MySQL 数据库性能优化之缓存参数优化51Testing软件测试网4_R j]:k mW
51Testing软件测试网;b}i0R`由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会使每个page中可存放的数据行数增大,那么每次 IO 可访问的行数也就增多了。反过来说,处理相同行数的数据,需要访问的 page 就会减少,也就是 IO 操作次数降低,直接提升性能。此外,由于我们的内存是有限的,增加每个page中存放的数据行数,就等于增加每个内存块的缓存数据量,同时还会提升内存换 中数据命中的几率,也就是缓存命中率。51Testing软件测试网&V uL6cF
$}@R TN0ejc0 数据类型选择51Testing软件测试网&D&OubL"Kh1b t'H
&|j;~.vl0 数据库操作中最为耗时的操作就是 IO 处理,大部分数据库操作 90% 以上的时间都花在了 IO 读写上面。所以尽可能减少 IO 读写量,可以在很大程度上提高数据库操作的性能。51Testing软件测试网AzW4uM @
vYQPi/t0 我们无法改变数据库中需要存储的数据,但是我们可以在这些数据的存储方式方面花一些心思。下面的这些关于字段类型的优化建议主要适用于记录条数较多,数据量较大的场景,因为精细化的数据类型设置可能带来维护成本的提高,过度优化也可能会带来其他的问题:51Testing软件测试网[N K;Q:{6e
51Testing软件测试网 B'p-Q:\$fj*T1、数字类型:非万不得已不要使用DOUBLE,不仅仅只是存储长度的问题,同时还会存在精确性的问题。同样,固定精度的小数,也不建议使用 DECIMAL,建议乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附加维护成本。对于整数的存储,在数据量较大的情况下,建议区分 开 TINYINT / INT / BIGINT 的选择,因为三者所占用的存储空间也有很大的差别,能确定不会使用负数的字段,建议添加unsigned定义。当然,如果数据量较小的数据库,也可以不用 严格区分三个整数类型。51Testing软件测试网%@}&gnmX"Kq:O
51Testing软件测试网cT m-PFqMP7f}2、字符类型:非万不得已不要使用 TEXT 数据类型,其处理方式决定了他的性能要低于char或者是varchar类型的处理。定长字段,建议使用 CHAR 类型,不定长字段尽量使用 VARCHAR,且仅仅设定适当的最大长度,而不是非常随意的给一个很大的最大长度限定,因为不同的长度范围,MySQL也会有不一样的存储处理。
uw X1`#lgy051Testing软件测试网,B1@-p:j} ah$_W4e%u3、时间类型:尽量使用TIMESTAMP类型,因为其存储空间只需要 DATETIME 类型的一半。对于只需要精确到某一天的数据类型,建议使用DATE类型,因为他的存储空间只需要3个字节,比TIMESTAMP还少。不建议通过INT类 型类存储一个unix timestamp 的值,因为这太不直观,会给维护带来不必要的麻烦,同时还不会带来任何好处。