基准测试:针对系统设计的一种压力测试。
基准测试的原因:
1. 验证基于系统的一些假设,确认这些假设是否符合实际情况。
2. 重现系统中的某些异常行为,已解决这些异常。
3. 测试系统当前的运行情况。
4. 模拟比当前系统更高的负载,找出系统可能遇到的扩展性瓶颈。
5. 测试应用适应可变环境的能力。
6. 测试不同额硬件、软件和操作系统的配置。
测试指标:吞吐量、响应时间或者延迟、并发性、可扩展性
服务器性能剖析
最常遇见的三个性能相关的请求是:如何确认服务器是否带到性能最佳的状态;找出某条语句为什么执行不够快;诊断被用户描述成“停顿、卡死”某些间隙性疑难故障。
性能优化定义:性能即是响应时间,每个查询花费的时间。
剖析Mysql查询:1. Mysql可以捕获慢查询,目前5.1可以捕获所有查询,慢查询是开销最低,精度最高的测试查询时间工具。
2. mysql还有另外一一直查询日志,称为“通用日志”,但是比较浪费时间和性能。
剖析单条查询
使用Show profile命令
schema与数据类型优化
选择优化数据类型:1. 更小的通常更好:占用更少的磁盘、内存和cpu缓存,并且处理时需要的cpu筑起也更少。
2. 简单就好:简单数据类型的操作通常需要更少的cpu周期。比如:整型比字符操作代价更低。
3. 避免使用NULL。NULL使得索引和索引统计都变的更加复杂。
整数类型:包含整数和实数
整数类型包含 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。整数类型可选的UNSIGNED属性,表示不允许负数。
实数表示带有小数的数组。最好使用decimal比double和float好。
字符串类型
varchar和char类型是最主要的字符串类型。varchar类型是存储可变长字符串,最常见的的字符串数据类型。比订场类型更节省空间。如果mysql使用row_format-fixed创建,每一行都使用定长存储,浪费空间。update花费的时间可能较长一点。
char:类型是定长的,适合存储很短的字符串或者所有字符串都接近一个长度。适合存储MD5密码。对于经常变更的数据使用char较好。使用char时会删除末尾的空格。
blob和text类型
blob和text都是为了存储很大的数据而设计的字符串数据类型,分表采用二进制和字符方式存储。
字符数据类型是:TINYTEXT、SMALLTEXT、TEXT、MEDIUMITEXT、LONGTEXT
二进制数据类型:TINYBLOB、SMALLBLOB、BLOB、MEDIUMIBLOB、LONGBLOB
实际中尽量少用这两种数据类型,可以使用枚举代替字符串类型。
日期和时间类型
mysql提供两种日期类型:datetime 和timestamp。datetime能过保存大范围的值,精度为秒,与时区无关。timestamp保存了1970年一拉的秒数,和unix时间戳相同,存储空间比datetime小的多。
选择标识符
可以选择1. 整数类型,使用auto_increment自增。
2. enum和set类型:避免使用
3. 字符串类型:UUID。 缺点:因为插入值会随机的写入到索引的不同位置,导致insert语句更慢;select语句变得更慢,因为逻辑相邻的行会分布在磁盘和内存的不同地方;随机值导致缓存对所有类型的查询语句效果都很差,因为会使得缓存赖以生存的访问局部性原理失效。
范式和反范式
在范式化的数据库中,每个事实数据会出现并且出现一次。在反范式的数据库中,信息时冗余的,可能存储在多个地方。
范式优缺点:范式化的更新操作快于反范式;当数据较好的范式化就会很少或者没有重复的数据,只需要修改更少的数据库;范式化的表更小,可以恨到的放在内存里,执行操作会更快;很少有多余的数据意外检索列表数据时更少需要使用distinct和group by语句。
缺点:需要关联。复杂的语句需要更多的关联,导致索引策略无效。
反范式优缺点:所有数据都在一张表中,可以很好的避免关联。如果数据比内存大时这可能比关联要快很多,避免了随机IO.
混合使用范式化和反范式化
最常见的反范式化的方法是复制或者缓存;有时候提升性能最好的方法是在同一张表中保存衍生的冗余数据,有时也需要创建一张完全独立的汇总表或者缓存表。
计数器表: 这种表用来缓存一个用户的朋友数,文件下载次数等。使用独立的表可以避免查询缓存失效。