mysql 性能
1.最大数据量
抛开数据量和并发数,性能即是毋庸之谈。
MySQL没有限制单表的最大记录数,它取决于操作系统对文件大小的限制。
文件系统 | 单文件大小限制 |
FAT32 | 最大4G |
NTFS | 最大64G |
NTFS5.0 | 最大2TB |
EXT2 | 块大小为1024字节,文件最大容量16GB;块大小为4.96字节,文件最大容量2TB |
EXT3 | 块大小为4KB字节,文件最大容量4TB |
EXT4 | 理论大于16TB |
当单表行数超过500万或者单表容量超2GB,推荐试用分表分库处理。
性能的影响因素是多方面的,依次为硬件配置、MySQL配置、数据库设计、索引优化。
2.最大并发数
并发数是指同一时刻数据库能处理多少的请求,由max_connections和max_user_connections决定。
max_connections是指MySQL实例的最大链接数,上限值为16384.
max_user_connections是指每个数据库用户的最大连接数。
查看值:
show variables like '%max_connections%'; 100
show variables like '%max_user_connections%'; 10
max_used_connections / max_connections * 100% = 3/100 *100% ≈ 3% ,
两者值最好比例大于10%。
响应时间=客户端UI渲染耗时+网络请求耗时+应用程序处理耗时+查询数据库耗时 3s为用户的体验时间,所以0.5秒是留给数据库的查询时间。
3.数据库设计
数据类型
数据库设计遵循三范式,字段类型选择:更简单或者占用空间小的原则
• 如果长度能够满足,整型尽量使用tinyint、smallint、medium_int而非int。
• 如果字符串长度确定,采用char类型。
• 如果varchar能够满足,不采用text类型。
• 精度要求较高的使用decimal类型,也可以使用BIGINT,比如精确两位小数就乘以100后保存。
• 尽量采用timestamp而非datetime。
避免空值
MySQL中字段为NULL时依然占用空间,会使索引、索引统计更加复杂。从NULL值更新到非NULL无法做到原地更新,容易发生索引分裂影响性能。尽可能将NULL值用有意义的值代替,也能避免SQL语句里面包含is not null的判断。
Text类型优化
由于text字段储存大量数据,表容量会很早涨上去,影响其他字段的查询性能。建议抽取出来放在子表里,用业务主键关联。
4.优化索引
索引分类:
• 普通索引:最基本的索引。
• 组合索引:多个字段上建立的索引,能够加速复合查询条件的检索。
• 唯一索引:与普通索引类似,但索引列的值必须唯一,允许有空值。
• 组合唯一索引:列值的组合必须唯一。
• 主键索引:特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用primary key约束。
• 全文索引:用于海量文本的查询,MySQL5.6之后的InnoDB和MyISAM均支持全文索引。由于查询精度以及扩展性不佳,更多的企业选择Elasticsearch。