Скрипт тестирования производительности БД MySQL

В последнее время особенно актуально встает вопрос – оптимально ли настроена БД, особенно на движках Битрикс где есть встроенная панель производительности, мы можем получить замеры не только БД но и других компонентов системы.
Недавно встал вопрос – есть ли какой-нибудь скрипт, который подобно Битрикс выдаст оценку производительности БД? Такой скрипт есть, написан он на PHP и он вполне рабочий:

<?
ini_set("display_errors",1);
error_reporting(E_ALL);
function getmicrotime()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

function GetDBMark($type)
{
    @mysql_pconnect("192.168.0.1", "USERNAME", "PASSWORD") or die("Could not connect to MySQL server!");
    @mysql_select_db("DATABASE") or die("Could not select company database!");

    $res = array();
    switch($type)
    {
        case "read":
            $strSql = "select * from b_perf_test WHERE ID = #i#";
            $bFetch = true;
            break;
        case "update":
            $strSql = "update b_perf_test set REFERENCE_ID = ID+1, NAME = '".str_repeat("y", 200)."' WHERE ID = #i#";
            $bFetch = false;
            break;
        default:
            mysql_query("truncate table b_perf_test");
            $strSql = "insert into b_perf_test (REFERENCE_ID, NAME) values (#i#-1, '".str_repeat("x", 200)."')";
            $bFetch = false;
    }

    for($j = 0; $j < 4; $j++)
    {
        $N1 = 0;
        $N2 = 0;

        $s1 = getmicrotime();
        for($i = 0; $i < 100; $i++)
        {
            $sql = str_replace("#i#", $i, $strSql);
        }
        $e1 = getmicrotime();
        $N1 = $e1 - $s1;

        $s2 = getmicrotime();
        for($i = 0; $i < 100; $i++)
        {
            //This is one op
            $sql = str_replace("#i#", $i, $strSql);
            $rs = mysql_query($sql);
            if($bFetch)
                mysql_fetch_array($rs);
        }
        $e2 = getmicrotime();
        $N2 = $e2 - $s2;

        if($N2 > $N1)
            $res[] = 100 / ($N2 - $N1);
    }

    if(count($res))
        return array_sum($res)/doubleval(count($res));
    else
        return 0;
}
echo "INSERT - ".GetDBMark(false);
echo "  READ - ".GetDBMark("read");
echo "  UPDATE - ".GetDBMark("update");
?>

Можем создать пустую тестовую базу данных, для чистоты эксперимента и в ней нужную нам таблицу b_perf_test:

CREATE DATABASE test;
use test;

CREATE TABLE b_perf_test
(
	ID INT(18) NOT NULL auto_increment,
	REFERENCE_ID INT(18),
	NAME varchar(200),
	CONSTRAINT PK_B_PERF_TEST PRIMARY KEY (ID)
);
CREATE INDEX IX_B_PERF_TEST_0 ON b_perf_test(REFERENCE_ID);

Обязательно должна быть установлена библиотека PHP для работы с MySQL:

yum install php php-mysql

Теперь запускаем его на сервере где присутствует PHP и смотрим результат работы:

# php db.php
INSERT - 3446.2330013176  READ - 2241.8416581295  UPDATE - 3263.6693487431

Related posts:

  1. Mysql – создание бд и заведение пользователей Создадим БД с кодировкой UTF8: или с кодировкой CP1251: Предоставим...
  2. How can I restore the MySQL root user’s full privileges? Stop MySQL server. Start MySQL server with –skip-grant-tables: Login (your...
  3. Как узнать размер бд в mysql? Бывает, когда требуется срочно узнать размер БД на сервере. В...
  4. Asterisk – храним CDR в БД MySQL. Asterisk. Настройка. Статья#1. Складываем CDR в MySQL. Должны быть установлены...
  5. Mysql: обновление timezone Чтобы проверить текущую временную зону, нужно выполнить команду: Чтобы посмотреть...
You can leave a response, or trackback from your own site.

Оставить комментарий

*