测试何种指标
在开始执行甚至是在设计基准测试之前 需要先明确测试的目标 测试目标决定了选择什么样的测试工具和技术 以获得精确而有意义的测试结果 可以将测试目标细化为一系列的问题 比如 这种CPU 是否比另外一种要快? 或 新索引是否比当前索引性能更好?
有时候需要用不同的方法测试不同的指标 比如 针对延迟(latency)和吞吐量(throughput)就需要采用不同的测试方法
请考虑以下指标 看看如何满足测试的需求
吞吐量
吞吐量指的是单位时间内的事务处理数 这一直是经典的数据库应用测试指标 一些标准的基准测试被广泛地引用 如TPC C(参考// tpc ) 而且很多数据库厂商都努力争取在这些测试中取得好成绩 这类基准测试主要针对在线事务处理(OLTP)的吞吐量 非常适用于多用户的交互式应用 常用的测试单位是每秒事务数(TPS) 有些也采用每分钟事务数(TPM)
响应时间或者延迟
这个指标用于测试任务所需的整体时间 根据具体的应用 测试的时间单位可能是微秒 毫秒 秒或者分钟 根据不同的时间单位可以计算出平均响应时间 最小响应时间 最大响应时间和所占百分比 最大响应时间通常意义不大 因为测试时间越长 最大响应时间也可能越大 而且其结果通常不可重复 每次测试都可能得到不同的最大响应时间 因此 通常可以使用百分比响应时间(percentile responsetime)来替代最大响应时间 例如 如果 % 的响应时间都是 毫秒 则表示任务在 % 的时间段内都可以在 毫秒之内完成
使用图表有助于理解测试结果 可以将测试结果绘制成折线图(比如平均值折线或者 % 百分比折线)或者散点图 直观地表现数据结果集的分布情况 通过这些图可以发现长时间测试的趋势 本章后面将更详细地讨论这一点
并发性
并发性是一个非常重要又经常被误解和误用的指标 例如 它经常被表示成多少用户在同一时间浏览一个Web 站点 经常使用的指标是有多少个会话注 然而 HTTP协议是无状态的 大多数用户只是简单地读取浏览器上显示的信息 这并不等同于Web 服务器的并发性 而且 Web 服务器的并发性也不等同于数据库的并发性 而仅仅只表示会话存储机制可以处理多少数据的能力 Web 服务器的并发性更准确的度量指标 应该是在任意时间有多少同时发生的并发请求
在应用的不同环节都可以测量相应的并发性 Web 服务器的高并发 一般也会导致数据库的高并发 但服务器采用的语言和工具集对此都会有影响 注意不要将创建数据库连接和并发性搞混淆 一个设计良好的应用 同时可以打开成百上千个MySQL 数据库服务器连接 但可能同时只有少数连接在执行查询 所以说 一个Web 站点 同时有 个用户 访问 却可能只有 ~ 个并发请求到MySQL 数据库
换句话说 并发性基准测试需要关注的是正在工作中的并发 *** 作 或者是同时工作中的线程数或者连接数 当并发性增加时 需要测量吞吐量是否下降 响应时间是否变长 如果是这样 应用可能就无法处理峰值压力
并发性的测量完全不同于响应时间和吞吐量 它不像是一个结果 而更像是设置基准测试的一种属性 并发性测试通常不是为了测试应用能达到的并发度 而是为了测试应用在不同并发下的性能 当然 数据库的并发性还是需要测量的 可以通过sy *** ench 指定 或者 个线程的测试 然后在测试期间记录MySQL 数据库的Threads_running 状态值 在第 章将讨论这个指标对容量规划的影响
可扩展性
在系统的业务压力可能发生变化的情况下 测试可扩展性就非常必要了 第 章将更进一步讨论可扩展性的话题 简单地说 可扩展性指的是 给系统增加一倍的工作 在理想情况下就能获得两倍的结果(即吞吐量增加一倍) 或者说 给系统增加一倍的资源(比如两倍的CPU 数) 就可以获得两倍的吞吐量 当然 同时性能(响应时间)也必须在可以接受的范围内 大多数系统是无法做到如此理想的线性扩展的 随着压力的变化 吞吐量和性能都可能越来越差
可扩展性指标对于容量规范非常有用 它可以提供其他测试无法提供的信息 来帮助发现应用的瓶颈 比如 如果系统是基于单个用户的响应时间测试(这是一个很糟糕的测试策略)设计的 虽然测试的结果很好 但当并发度增加时 系统的性能有可能变得非常糟糕 而一个基于不断增加用户连接的情况下的响应时间测试则可以发现这个问题
一些任务 比如从细粒度数据创建汇总表的批量工作 需要的是周期性的快速响应时间 当然也可以测试这些任务纯粹的响应时间 但要注意考虑这些任务之间的相互影响 批量工作可能导致相互之间有影响的查询性能变差 反之亦然
归根结底 应该测试那些对用户来说最重要的指标 因此应该尽可能地去收集一些需求 比如 什么样的响应时间是可以接受的 期待多少的并发性 等等 然后基于这些需求来设计基准测试 避免目光短浅地只关注部分指标 而忽略其他指标
返回目录 高性能MySQL
编辑推荐
ASP NET开发培训视频教程
数据仓库与数据挖掘培训视频教程
lishixinzhi/Article/program/MySQL/201311/29741在上一文章 《 【技术干货】作为测试,你必须知道的MySQL知识(一) 》 中我们已经学了MySQL基础知识。对于 最常用、最重要 的select语句将会在本文与大家分享,带你轻松搞定查询语句。
学习select之前,需先知道查询语句 逻辑执行顺序 ,了解了逻辑执行顺序,对我们写select语句有帮助,但是需要注意的是,逻辑顺序并不是真正执行的顺序,因为MySQL 优化器 会将SQL子句按最优的路径执行。如果想要查看实际执行顺序,可使用Explain关键字进行分析,获取对应的执行计划。
查询语句的使用都离不开以下的格式:
需要记住,这是学好查询语句的基础~
以上select的逻辑执行顺序如下(前面的序号):
查询语句中where后面支持多种运算符,进行条件的处理,其中常见运算符包括:比较运算、逻辑运算、模糊查询、范围查询、空判断。
① 等于: =
② 大于: >
③ 大于等于: >=
④ 小于: <
⑤ 小于等于: <=
⑥ 不等于: != 或 <>
① and
② or
③ not
【模糊查询语法】:字段名 like <匹配字段字符串>
【常见的匹配字段字符串】:%、_、[] 、[^]
① in:表示在一个非连续的范围内
② between ... and ...:表示在一个连续的范围内
① 判断为空:is null
② 判断非空:is not null
【注意】:null与''是不同的。
使用JOIN 来联合多表查询,JOIN 按照功能大致分为如下三类:
① INNER JOIN(内连接) : 获取两个表中字段匹配关系的记录。
② LEFT JOIN(左连接) : 获取左表所有记录,即使右表没有对应匹配的记录。
③ RIGHT JOIN(右连接) : 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
->【举个栗子】:对表t_user与表t_order进行内连接
->【举个栗子】:对表t_user与表t_order进行左连接
->【举个栗子】:对表t_user与表t_order进行右连接
① 内连接: 保留两表中交集的记录;
② 左连接: 左表全部保留,右表关联不上用null表示;
③ 右连接: 右表全部保留,左表关联不上的用null表示。
group by语句是根据一个或多个列对结果集进行分组。在分组的列上我们经常会使用到 聚合函数 ,因此,先了解 常用的聚合函数 :
① sum():求和
② avg():求平均数
③ count():统计记录条数
④ max():求最大值
⑤ min():求最小值
【group by语法】:
可以根据某个字段(column_name)进行分组。如果不指定分组字段,默认将所有记录作为一组。
->【举个栗子】: 在emp表中,有3个字段,一个是员工id(id),一个是部门id(dept_id),一个是员工薪水(salary)
【注意】:
① 使用group by的select语句中的字段,应该 出现在 聚合函数 中,或者 出现在 group by 中;
② having 子句可以使用聚合函数,而 where 子句不能使用。
③从逻辑执行过程可知: where 是没有分组前对所有数据进行过滤, having 是对分组后的数据进行过滤。
子查询是指一个查询语句嵌套在另一个查询语句内部的查询。
->【举个栗子】: 一张user表,有2个字段,一个是名称(name),一个是年龄(age),查询出比小李年龄高的人有哪些?
- >【举个栗子】: 获取员工工资低于所在部门的平均工资的员工信息
要对某个字段进行降序,可以在查询语句后可使用:order by <排序的字段名>desc
要对某个字段进行升序,可以在查询语句后可使用:order by <排序的字段名>asc
【注意】:order by默认情况下是升序,asc可省略不写。
有2个维度的排序时,使用逗号隔开2个排序,优先使用前者进行排序,再使用后者进行排序。
limit:限制查询数据条数,经常在分页的场景中应用。LIMIT子句接受一个或两个参数。参数值都必须为零或正整数。limit的使用格式:
【参数解释】:
limit N : 返回 N 条记录
offset M : 跳过 M 条记录, 默认 M=0
limit N,M : 从第 N 条记录开始, 返回 M 条记录。
->【举个栗子】:
【注意】:limit的两个参数中:
① 第1个参数:指要返回的第一行的偏移量。第一行的偏移量为0,而不是1;
② 第2个参数:指要返回的记录行数。
如上面"检索6-15行记录"例子中,第1个参数为5,其实指的是第6行;第2个参数为10,指的是从第6行开始,取10条记录,所以是获取到6-15的记录。
当需要查询出某个字段不重复的记录时,可以使用distinct来过滤重复的记录,格式如下:
使用distinct可以进行单字段去重、多字段去重、所有字段去重、以及与聚合函数的综合使用。
-->【举个栗子】: student表中有name、age、weight3个字段字段。
使用distinct之后,只能返回去重的字段,而不能返回其他的字段,可以使用group by进行去重查询,
【注意】:
① distinct 只能在select语句中使用;
② distinct 必须在所有字段的最前面;
③ 多个字段去重时,多个字段组合后一样时才会被去重;
④ 列中有null值,当对该列使用distinct子句,将保留一个null值(所有null值被视为相同的值)。
出现在select语句中的select语句,称为子查询或内查询。
外部的select查询语句,称为主查询或外查询。
测试数据比较多,放在我的个人博客上了。
浏览器中打开链接:http://www.itsoku.com/article/196
mysql中执行里面的 javacode2018_employees库 部分的脚本。
成功创建 javacode2018_employees 库及5张表,如下:
运行最后一条结果如下:
in,any,some,all分别是子查询的关键词之一。
in :in常用于where表达式中,其作用是查询某个范围内的数据
any和some一样 : 可以与=、>、>=、<、<=、>结合起来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的任何一个数据。
all :可以与=、>、>=、<、<=、>结合使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。
下文中会经常用到这些关键字。
运行结果:
not in的情况下,子查询中列的值为NULL的时候,外查询的结果为空。
建议:建表是,列不允许为空。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)