Назад | Перейти на главную страницу

Инструмент для проверки задержки MySQL

Я хочу сравнить задержку моего веб-приложения с двумя разными серверами 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