一、概述
应用程序架构中(Lamp),最慢的一环,都是数据库!
PHP:业务逻辑都是相似的,不会随着数据的增加而变得更加复杂。
MySQL:数据是不断增加的,同样的运算,随着数据的增加而变慢!
二、如何提升数据库效率
通常需要从4个方面考虑。
设计方面:存储引擎的选择,字段类型的选项,实体间的关系设计,范式的选择。
功能方面:索引,查询缓存,分区分表等等。
架构层面:负载均衡集群,读写分离的处理,冷热数据分离。
应用层面:SQL应该如何书写、多表联查、表单查询、尽可能避免哪些低效的SQL。
三、字段类型的选择(可优化性不强)
建表时,往往需要考虑字段的类型问题,需要注意以下几个原则:
1.尽可能占用更少的存储空间,可能出现的问题,存储量的减少,范围的减少。
例:tinyint:1Byte;
smallint:2Byte;
mediumint:3Byte;
int:4Byte;
bigint:8Byte;
可能出现的问题:
datetime:8Byte;
timestamp:4Byte;
datetime和timestamp的选择?
当存储的时间超过了unix时间戳的范围(2038年1月19日11时14分08秒),timestamp字段就会失败。
如果我们仅仅存储登录时间则可以用timestamp来存储。
2.char和varchar的选择:
定长的数据类型的运算速度,要比变长的数据类型速度快
类型:char(32) varchar(32)
数据:hello hello
空间:32 5+1(1个空间记录长度)
如果在乎存储空间:varchar;
如果在乎计算效率:char;
3.varchar和text的选择:
varchar最大的存储空间65535Byte。
text最大的存储空间65535Byte。
varchar占用记录的存储空间。
text不占用记录的存储空间。
一条记录的存储空间有最大的限制,默认为65535Byte。
如果使用varchar,并且该字段占用了60000Byte,则该条语句的其他字段存储空间最大不能超过5535Byte。
而使用text,则不会出现以上情况。
4.浮点(double:8Byte/fload:4Byte)和定点(decimal)的选择:
浮点:更在乎存储空间,不能保留全部的精度,定长数据类型,占用固定的存储空间。
定点:更在乎精度,占用非固定的存储空间,随着有效位数增加,而占用更多的存储空间。
5.尽可能用整数代替字符串
整数计算能力最强
例:ipv4的存储,可以转成int。(存储空间小,整数计算快)