Я хочу сравнить задержку моего веб-приложения с двумя разными серверами MySQL: один на локальном компьютере, а другой на Amazon RDS.
Что было бы хорошим, бесплатным и (желательно) простым инструментом для проверки задержки MySQL? У меня есть как Windows, так и Linux, поэтому инструменты должны работать хотя бы на одном из них.
Какой тип задержки вы хотите измерить?
Тем не менее, это довольно просто для домашнего приготовления - выберите библиотеку сценариев по вашему выбору (python, perl, php, что угодно), а затем загрузите библиотеку синхронизации. В псевдокоде это выглядело бы примерно так:
timer.start()
query.execute()
timer.stop()
Выполните это на различных серверах и проверьте задержку.
Чтобы проверить задержку MySQL в целях сравнения, я бы взял несколько наиболее частых запросов, которые вы обычно используете, и запустил их как в вашей локальной базе данных, так и в базе данных RDS, и тогда вы увидите разницу в задержке между ними. Это связано с тем, что задержка во многом зависит от типа запросов и объема данных, которые вы должны получить.
Кстати, вот интересный сообщение о задержках базы данных, и, поскольку вы используете RDS, в этом облачная база данных site вы можете найти сравнение задержки между RDS и другой облачной базой данных. Ура :)
Создайте две хранимые процедуры
Установите эту базу данных и хранимые процедуры
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 Local Machine и Amazon RDS.
Я написал этот алгоритм еще 3 апреля 2012 года: https://dba.stackexchange.com/a/16029/877