我想比较我的 Web 应用程序与两个不同的 MySQL 服务器的延迟:一个是本地机器,一个通过 Amazon RDS 托管。
有什么好用的、免费的、(最好)易用的工具可以用于测试 MySQL 延迟?我同时使用 Windows 和 Linux,因此这些工具应该至少可以在其中一种上运行。
答案1
您希望测量哪种类型的延迟?
无论如何,这对于自制来说相当简单 - 选择一个你喜欢的脚本库(python、perl、php 等等),然后加载一个计时库。在伪代码中,它看起来像这样:
timer.start()
query.execute()
timer.stop()
针对各种服务器执行该操作并检查延迟。
答案2
创建两个存储过程
- 一个运行您选择的查询
- 对第一个存储过程进行基准测试
安装此数据库和存储过程
drop database if exists mybmark;
create database mybmark;
use mybmark
DELIMITER $$
DROP PROCEDURE IF EXISTS `mybmark`.`testproc` $$
CREATE PROCEDURE `mybmark`.`testproc` ()
BEGIN
DECLARE answer INT;
SELECT 1+2 INTO answer;
END $$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS `mybmark`.`mybenchmark` $$
CREATE PROCEDURE `mybmark`.`mybenchmark` (loop_count INT,expr varchar(128))
BEGIN
DECLARE dt1,dt2,dtdiff,ndx INT;
SET dt1 = UNIX_TIMESTAMP();
SET ndx = loop_count;
SET @sql = expr;
PREPARE stmt FROM @sql;
WHILE ndx > 0 DO
EXECUTE stmt;
SET ndx = ndx - 1;
END WHILE;
DEALLOCATE PREPARE stmt;
SET dt2 = UNIX_TIMESTAMP();
SET dtdiff = dt2 - dt1;
SELECT dt1,dt2,dtdiff;
END $$
DELIMITER ;
存储过程mybmark.testproc
刚刚执行了表达式的 SELECT。您可以通过拥有一个包含 131,072 行的表来进一步测试此基准测试。然后,您可以故意进行缓慢计数的查询。
首先创建表并填充 131,072 行
USE mybmark;
CREATE TABLE mytable (A int) ENGINE=MyISAM;
INSERT INTO mytable VALUES (1);
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
INSERT INTO mytable SELECT A FROM mytable;
接下来将 的缓慢计数添加mytable
到 中mybmark
。testproc
DELIMITER $$
DROP PROCEDURE IF EXISTS `mybmark`.`testproc` $$
CREATE PROCEDURE `mybmark`.`testproc` ()
BEGIN
DECLARE answer INT;
SELECT COUNT(1) INTO answer FROM mybmark.mytable WHERE 1=1;
END $$
DELIMITER ;
现在,拨打mybmark
. mybenchmark
10 次
call mybmark.mybenchmark(100,'CALL mybmark.testproc()');
call mybmark.mybenchmark(1000,'CALL mybmark.testproc()');
call mybmark.mybenchmark(10000,'CALL mybmark.testproc()');
call mybmark.mybenchmark(100000,'CALL mybmark.testproc()');
在 MySQL 本地计算机和 Amazon RDS 中执行所有这些步骤
我于2012年4月3日写了这个算法:https://dba.stackexchange.com/a/16029/877
答案3
为了便于比较,为了测试 MySQL 延迟,我会选取一些您最常用的查询,并在本地和 RDS 数据库上运行它们,然后您就会知道两者之间的延迟差异。这是因为延迟很大程度上取决于查询的类型和您要检索的数据量。
顺便说一句,这是一个有趣的关于数据库延迟的帖子并且,由于您使用的是 RDS,因此云数据库您可以找到 RDS 和另一个云数据库之间的延迟比较。干杯 :)