MySQL性能优化
- 主要针对InnoDB,本文主要是依赖于《高性能MySQL》
字段选择
- 在建表的时候,如果业务没有特别要求,每个字段要避免为空,为空的列需要占用更多的存储空间,MySQL也需要进行特殊处理,当可以为空的列作为索引的时候,每个
索引记录
需要一个额外的存储空间,在MyISAM中甚至会导致固定长度的索引变为可变长的索引,这是非常危险的,并且为空,会导致索引失效,如果字段可以为空,那么在查询的时候就会想用!=
或者is not null
,这会导致索引失效(亲测)。但是,并不意味着,将表的字段改为不为空就会提升性能,这对性能的提升不是很大, 要想提升性能,还是要依赖建立优质的索引等方法,只有在不得已的情况下,才进行将NULL
改为NOT NULL
,并且对于大表,改变表的定义,这是非常耗时的(后面会讲到)。当然,对于InnoDB,该引擎使用单独的bit来存储NULL值,这对稀疏矩阵有很高的空间效率,但不适用于MyISAM(这来自于《高性能MySQL》,本人不是很明白,希望有懂的人解释一下)
字符串类型
- 对于字符串类型,MySQL有
varchar
char
等类型,在开发中,首选varchar
,varchar
用来储存不定长的字符串,而char
是定长的字符串,也就是说varchar
只会占用必要的存储空间,但是char
,无论是多长的字符串,都是一样的存储空间,这会造成空间浪费。 varchar
需要额外的1或者2个字节来记录字符串的长度:- 如果列的最大长度小于或者等于255,那么就只需要1个额外字节,否则使用2个字节,比如:在latin1字符集中,
varchar(10)
的列占用11个字节,varchar(1000)
的列占用1002个字节
- 如果列的最大长度小于或者等于255,那么就只需要1个额外字节,否则使用2个字节,比如:在latin1字符集中,
- 在5.0以上的版本中,MySQL在存储和检索的时候会保留末尾空格,在低版本中,会剔除掉末尾空格。但是,即使是高版本的MySQL,对于
char
类型,依然会删除掉末尾的空格,但varchar
不是。 - 由于
char
是存储定长的,那么就适合存储那些长度较为统一,尤其是MD5,对于表中大多数的数据都是很短的情况下,请使用char
。 - InnoDB中,过长的
varchar
会存储成BLOB
时间类型
-
千万不要用字符串来存储时间,这是非常愚蠢的行为,只有入门程序员才会这么做
-
DATATIME
-
这个类型能存储大范围的时间,从1001到9999年,精确到秒,存储到格式为
YYYYMMDDHHMMSS
的整数中,这个类型的时间与时区是无关的,使用8个字节来存储。 -
未完待续…