Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Percona MySQL table locking

Anna | 31.05.2014 | нет комментариев

Установил себе Percona MySQL server 5.5 HandlerSocket. Решил поиграться. Вот тестовый скрипт:

Insert with PDO code

<?php

function out($line = '')
{
	echo PHP_EOL.$line.PHP_EOL;
}

function sep()
{
	out();
	out('------------------------------');
	out();
}

/**
 * @param $pdo PDO
 * @param $config array
 */
function run($pdo, $config)
{
	$sql = "TRUNCATE products";

	$stmt = $pdo->prepare($sql);
	$stmt->execute();

	$numberOfInsertOps = $config['insert_number'];

	$startInsertTime = microtime(true);

	$sql = "INSERT INTO products (name, price) VALUES (:name, :price)";
	$stmt = $pdo->prepare($sql);

	for ($i = 0; $i < $numberOfInsertOps; $i  )
	{
		$name = md5(rand(0, 1000));
		$price = rand(1, 1000);

		$stmt->bindParam(':name', $name);
		$stmt->bindParam(':price', $price);

		try
		{
			$result = $stmt->execute();

			if (!$result)
			{
				out('shit happened');
			}

			out($pdo->lastInsertId());
		}
		catch (Exception $e)
		{
			sep($e->getMessage());
		}
	}

	out('Insert in one query time: ' . ( microtime(true) - $startInsertTime) );
}

$pdo = new PDO("mysql:host=$hostname;dbname=$db_name", $username, $password);

run($pdo, array(
	'insert_number' => 100
));

По идеи обязаны вставится все 100 записей. На иной машине все верно работает, но там обыкновенный MySQL стоит.
А у меня происходит следующее:

— число добавленных сторк неизменно лежит в диапазоне 40-70 и при всяком выполнении скрипта их число меняется.
— Если проверить $pdo->errorInfo() — возвращает код 0000 — знаит что все отлично, легко число affected rows равно 0.
— И позже первой не вставленной строки — все следующие тоже не добавляются.
То есть в выводе выполнения скрипта я вижу что-то как бы:

1
2
3

60
61
62
shit
62
shit
62
shit
62
shit

Схоже на блокоровки.

Если движок таблицы на MyISAM — то задачи не появляются.

Если добавить такой хак (с 49 сторки) — задача решается (Но решением это назвать немыслимо).

Вот конструкция таблици:

CREATE TABLE IF NOT EXISTS `products` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `price` int(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

И еще:

если вставлять записи в таблицу с поддержкой HandlerSocket:

Insert with HandlerSocket code

	$hs = new HSPHPWriteSocket();
	$hs->connect();

	$id = $hs->getIndexId('test','products','','name,price');

	$startHandlerSocketInsertTime = microtime(true);
	for ($i = 0; $i < $numberOfInsertOps; $i  )
	{
		$name = 'handler-'.md5(rand(0, 1000));
		$price = rand(0, 1000);

		$hs->insert($id, array($name, $price));
	}

	out('Insert HandlerSocket time: ' . ( microtime(true) - $startHandlerSocketInsertTime) );

То число вставленых строк в БД также зависит от числа итераций цикла.

if 10 loops — I have 100 rows in DB table
if 50 loops — 50 rows
if 100 loops — 100 rows
if 500 loops — 500 rows
if 1000 loops — ~1100 rows и это число будет менятся всякий раз когда запуская скрипт.

В чем может быть задача? Как её обнаружить и устранить?

Предварительно благодарствую.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB