如何测试mysql的性能和稳定性

如何测试mysql的性能和稳定性,第1张

 有一些有用的工具可以测试MySQL 和基于MySQL 的系统的性能。这里将演示如何利用这些工具进行测试。

mysqlslap

mysqlslap可以模拟服务器的负载,并输出计时信息。它包含在MySQL 5.1 的发行包中,应该在MySQL 4.1或者更新的版本中都可以使用。测试时可以执行并发连接数,并指定SQL 语句(可以在命令行上执行,也可以把SQL 语句写入到参数文件中)。如果没有指定SQL 语句,mysqlslap 会自动生成查询schema 的SELECT 语句。

MySQL Benchmark Suite (sql-bench)

在MySQL 的发行包中也提供了一款自己的基准测试套件,可以用于在不同数据库服务器上进行比较测试。它是单线程的,主要用于测试服务器执行查询的速度。结果会显示哪种类型的 *** 作在服务器上执行得更快。

这个测试套件的主要好处是包含了大量预定义的测试,容易使用,所以可以很轻松地用于比较不同存储引擎或者不同配置的性能测试。其也可以用于高层次测试,比较两个服务器的总体性能。当然也可以只执行预定义测试的子集(例如只测试UPDATE 的性能)。这些测试大部分是CPU 密集型的,但也有些短时间的测试需要大量的磁盘I/O *** 作。

这个套件的最大缺点主要有:它是单用户模式的,测试的数据集很小且用户无法使用指定的数据,并且同一个测试多次运行的结果可能会相差很大。因为是单线程且串行执行的,所以无法测试多CPU 的能力,只能用于比较单CPU 服务器的性能差别。使用这个套件测试数据库服务器还需要Perl 和BDB 的支持,相关文档请参考.

Super Smack

Super Smack是一款用于MySQL 和PostgreSQL的基准测试工具,可以提供压力测试和负载生成。这是一个复杂而强大的工具,可以模拟多用户访问,可以加载测试数据到数据库,并支持使用随机数据填充测试表。测试定义在"smack"文件中,smack 文件使用一种简单的语法定义测试的客户端、表、查询等测试要素。

Database Test Suite

Database Test Suite 是由开源软件开发实验室(OSDL,Open Source DevelopmentLabs)设计的,发布在SourceForge 网站上,这是一款类似某些工业标准测试的测试工具集,例如由事务处理性能委员会(TPC,Transaction Processing Performance Council)制定的各种标准。特别值得一提的是,其中的dbt2 就是一款免费的TPC-C OLTP 测试工具(未认证)。之前本书作者经常使用该工具,不过现在已经使用自己研发的专用于MySQL 的测试工具替代了。

Percona's TPCC-MySQL Tool

我们开发了一个类似TPC-C 的基准测试工具集,其中有部分是专门为MySQL 测试开发的。在评估大压力下MySQL 的一些行为时,我们经常会利用这个工具进行测试(简单的测试,一般会采用sysbench 替代),在源码库中有一个简单的文档说明。

sysbench

sysbench是一款多线程系统压测工具。它可以根据影响数据库服务器性能的各种因素来评估系统的性能。例如,可以用来测试文件I/O、 *** 作系统调度器、内存分配和传输速度、POSIX 线程,以及数据库服务器等。sysbench 支持Lua 脚本语言,Lua 对于各种测试场景的设置可以非常灵活。sysbench 是我们非常喜欢的一种全能测试工具,支持MySQL、 *** 作系统和硬件的硬件测试。(节选自《高性能MySQL》)

1、cmd进入dos控制台中

2、使用mysql -uroot p密码 进入mysql的命令控制台

3、执行show status

可以使用like '%XXX%'进行过滤

例:已经创建过的连接和当前正使用的连接数

Threads_created | 50

Threads_connected| 5

对于想要将自动生成的数据添加到表中的任何人来说, MySQL 虚拟列 是一个强大、易于使用和高级的功能。

INSERT 生成的列允许您在不使用and UPDATE 子句的情况下将自动生成的数据存储在表中。 这个有用的特性自 5.7 版 起就已成为 MySQL 的一部分,它代表了在生成数据时触发器的另一种方法。此外,生成的列可以帮助您更轻松、更高效地查询。

虚拟列 列类似于普通列,但您不能手动更改其值。这是因为表达式定义了如何根据从同一行的其他列中读取的其他值来生成生成列的值。因此,生成的列在表的域内工作,其定义不能涉及 JOIN 语句。

换句话说,您可以将生成的列视为一种视图,但仅限于列。请注意,生成的列与 SQL 触发器 不同,您只能在使用 CREATE TABLE or语句时定义它们,语法如下:ALTER TABLE

该 AS (generated_column_expression) 子句指定要添加或更新到表中的列是生成的列。定义 MySQL 将用于计算列值的 generation_expression 表达式,它不能引用另一个生成的列或除当前表的列之外的任何内容。另外,请注意生成表达式只能涉及不可变函数。例如,您不能在生成的列表达式定义中使用返回当前日期的函数,因为它是一个可变函数。

您还可以在关键字前面 AS 加上 GENERATED ALWAYS 关键字以使生成的列的性质更加明确,但这是可选的。然后,您可以指示生成列的类型是 VIRTUAL 还是 STORED 。您将在下面的章节中了解这两种类型之间的区别。默认情况下,如果没有在查询中明确指定,MySQL 会将生成的列标记为 VIRTUAL .

现在让我们看看生成的列语法在 CREATE TABLE 查询中的作用:

在此示例中,该 full_name 列将自动存储 first_name 和 last_name 列的连接。

如前所述,您可以将生成的列定义为 VIRTUAL 或 STORED。现在让我们仔细看看这两种类型。

MySQL 不存储标记为 VIRTUAL 的 虚拟列 。这意味着 MySQL 在需要时动态评估其值。 BEFORE 这通常在触发任何查询后立即发生。换句话说,虚拟生成的列不占用存储空间。

MySQL 存储任何生成的标记为 STORED 的列。这意味着每次插入或更新行时,MySQL 都会评估其值并将其存储在磁盘上。换句话说,存储列需要存储空间,就好像它是普通列一样。

现在让我们进一步了解虚拟列和存储生成列的优缺点。

优点

缺点

优点

缺点

采用生成的列有几个原因,但以下三个是最重要的。

如您所见,您可以通过将四列与以下生成的列聚合来轻松生成此数据字段:

这将产生:

在这种情况下,生成的列使您能够直接在数据库级别标准化数据字段格式。此外,存储生成的列避免了每次需要时都构造此字段的不可避免的开销。

通常,您使用网站 URL 中的资源 ID 或REST API来检索您需要的数据。但是公开暴露您的 ID 可能会带来安全问题。当您发现自己使用自动增量 ID 时尤其如此,这很容易预测并使抓取或机器人攻击更容易。

为避免这种情况,您可以考虑通过使用自动生成的、随机的、更安全的公共 ID 来隐藏您的原始 ID。您可以通过对您的 ID 进行散列处理,使用虚拟生成的列来实现这一点,如下所示:

请注意,为避免生成已知的哈希值,您可以将您的 ID 与特殊关键字连接起来。 在此处了解有关 MySQL 加密和压缩功能的更多信息。

过滤数据时,有些列比其他列更有用。此外,您通常必须更改存储在列中的值的表示形式,以使过滤更简单或更直观。您可以定义一个有用的生成列来存储以所需格式执行过滤所需的信息,而不是在每个过滤器查询中执行此 *** 作。

例如,您可以定义一个生成的列,以便更轻松地找到篮球队中的球员,如下所示:

这样的列将产生:

如前所述,您只能在表中使用生成的列。此外,它们只能涉及不可变函数,并且MySQL 生成它们的值以响应 INSERT or UPDATE 查询。另一方面,触发器是 MySQL 自动执行的存储程序,每当与特定表关联的 或 事件发生 INSERT 时 UPDATE 。 DELETE 换句话说,触发器可以涉及多个表和所有 MySQL 函数。与生成的列相比,这使它们成为更完整的解决方案。同时,MySQL 触发器本质上使用和定义更复杂,也比生成的列慢。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/8434919.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-16
下一篇2023-04-16

发表评论

登录后才能评论

评论列表(0条)

    保存