8.13 Measuring Performance (Benchmarking)
8.13.1 Measuring the Speed of Expressions and Functions
8.13.2 Using Your Own Benchmarks
8.13.3 Measuring Performance with performance_schema
要衡量性能,请考虑以下因素:
无论你是在一个安静的系统上测量单个操作的速度,还是一组操作 "工作负载" 在一段时间内的工作方式。通过简单的测试,你通常测试更改一个方面配置设置、表上的索引集、查询中的 SQL 子句如何影响性能。基准测试通常是长时间运行的、精心设计的性能测试,测试结果可以决定高级别的选择,比如硬件和存储配置,或者多久升级到新的 MySQL 版本。
对于基准测试,有时必须模拟沉重的数据库工作负载才能得到准确的图像。
由于有太多不同的因素,表现可能会有所不同,因此几个百分点的差异可能不是决定性的胜利。当你在不同的环境中进行测试时,结果可能会发生相反的变化。
某些 MySQL 特性是否有助于性能取决于工作负载。为了完整性,总是在打开和关闭这些特性的情况下测试性能。在每个工作负载中要尝试的最重要的特性是 InnoDB 表的自适应哈希索引。
本节从单个开发人员可以完成的简单而直接的度量技术发展到更复杂的技术,这些技术需要额外的专业知识来执行和解释结果。
8.13.1 Measuring the Speed of Expressions and Functions
要度量特定 MySQL 表达式或函数的速度,可以使用 MySQL 客户机程序调用 BENCHMARK() 函数。它的语法是 BENCHMARK(loop_count,expr)。返回值总是 0,但是 mysql 打印一行代码,显示语句执行大约需要多长时间。例如:
# SELECT BENCHMARK(1000000,1+1);
这个结果是在奔腾系统上得到的。这表明 MySQL 可以在 0.32 秒内执行 100 万个简单的加法表达式。
内置的 MySQL 函数通常是高度优化的,但也有一些例外。BENCHMARK() 是一种非常好的工具,用于查明某个函数是否对查询造成问题。
8.13.2 Using Your Own Benchmarks
对应用程序和数据库进行基准测试,找出瓶颈所在。在修复一个瓶颈或者用一个 "虚拟" 模块替换它之后,你可以继续识别下一个瓶颈。即使你的应用程序当前的总体性能是可以接受的,你至少应该为每个瓶颈制定一个计划,并决定如果某天你确实需要额外的性能,如何解决它。
通常只有在系统负载非常重的时候才会出现问题。我们有很多客户在生产测试系统时联系我们,他们遇到了负载问题。在大多数情况下,性能问题是由基本数据库设计问题例如,表扫描在高负载下效果不好或操作系统或库问题造成的。在大多数情况下,如果系统还没有投入生产,那么修复这些问题会容易得多。
为了避免这样的问题,在最坏的负载下对整个应用程序进行基准测试:
mysqlslap 可以帮助模拟同时发出查询的多个客户机产生的高负载。
还可以尝试对诸如 SysBench 和 DBT2 这样的包进行基准测试,这些包可以从 https://launchpad.net/sysbench 和 http://osdldbt.sourceforge.net/# DBT2 获得。
这些程序或包可能会让系统崩溃,所以确保只在开发系统上使用它们。
8.13.3 Measuring Performance with performance_schema
可以查询 performance_schema 数据库中的表,查看关于服务器及其运行的应用程序的性能特征的实时信息。
领取专属 10元无门槛券
私享最新 技术干货