Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2016, 15:39   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Одна таблица, 100-200 записей, прочитал и очистил и ни каких truncate
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.08.2016, 16:10   #12
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Зачем чистить?
come-on вне форума Ответить с цитированием
Старый 13.08.2016, 16:33   #13
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
Зачем чистить?
Ну нужно мне одно поле в записи очистить (update ''). Там теперь еще есть поля, которые не нужно трогать

Последний раз редактировалось Illusiony; 13.08.2016 в 16:42.
Illusiony вне форума Ответить с цитированием
Старый 13.08.2016, 16:35   #14
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Одна таблица, 100-200 записей, прочитал и очистил и ни каких truncate
У меня не одна таблица будет, а 100-200. Я уже писал почему не в одной таблице. И если я просто выполню последовательно 2 запроса чтение очистку(update), то между ними может вклиниться ( хотя и маловероятно) другая программа и сделать свои действия не должным образом( вроде как) .

Последний раз редактировалось Illusiony; 13.08.2016 в 16:41.
Illusiony вне форума Ответить с цитированием
Старый 13.08.2016, 17:02   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Есть же SELECT ... FOR UPDATE. А 200 таблиц по одной записи для ржачки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.08.2016, 18:11   #16
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Есть же SELECT ... FOR UPDATE. А 200 таблиц по одной записи для ржачки
Вот так?
Код:
sql = mysqli_query($link," SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE;
UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1;");
А как использовать строку вместо COUNTER_FIELD?

Последний раз редактировалось Illusiony; 13.08.2016 в 18:23.
Illusiony вне форума Ответить с цитированием
Старый 13.08.2016, 18:29   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

SELECT ... FROM ... WHERE ... FOR UPDATE
запускает транзакцию и отобранные строки лочатся для такой же команды. На чтение доступны в зависимости от уровня изоляции транзакции. В твоем случае выбирать одну строку по ид из таблицы
UPDATE для этой строки снимает лок
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.08.2016 в 18:32.
Аватар вне форума Ответить с цитированием
Старый 13.08.2016, 18:33   #18
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Иду дерзать материал.
Сама таблица сейчас такая:

Код:
`status` TINYINT (1) NOT NULL ,
  `data_xod` TIMESTAMP NOT NULL default '0000-00-00 00:00:00',
  `str_click` VARCHAR(60)NOT NULL ,
  `c_p` CHAR(32)NOT NULL ,
  `x` SMALLINT UNSIGNED NOT NULL ,
  `y` SMALLINT UNSIGNED NOT NULL 
)
ENGINE = MEMORY
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci");
Вот это хотя бы получилось пока:
Код:
$sql = mysqli_query($link," UPDATE `HSCrab` SET str_click = CONCAT(str_click,'a') ");
А

А тут нужно два отдельных запроса и так нельзя?:
Код:
sql = mysqli_query($link," SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE;
UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1;");

Так правильно?:
Код:
$sql = mysqli_query($link,"SELECT str_click FROM `HSCrab` FOR UPDATE;"); // блокируем поле от изменений
$sql = mysqli_query($link,"UPDATE `HSCrab` SET str_click = CONCAT(str_click,'".$s."')"); // добавляем изменения и перезаписываем

Последний раз редактировалось Illusiony; 13.08.2016 в 20:07.
Illusiony вне форума Ответить с цитированием
Старый 15.08.2016, 18:32   #19
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

А вообще, может быть я в полном заблуждении в структуре задумки?
Поясняю. Соотношение кол http запросов от 2х программ к количеству очень простых запросов Mysql к очень простой (или простым) таблицам, допустим 1 http запрос на 2-3 запроса к бд.

Я без понятия, но наверное 1 http запрос, даже самый коротенький займет больше времени чем этих 3 запроса к бд. Таким образом, возможно мне даже и не требуется делать какую то такую "преждевременную оптимизацию" и обычной одной таблицы innodb для всех этих данных хватит с головой? ( там SSD нормальной скорости на сервере). То есть, если я правильно понимаю, будет намного более сильно нагружен http сервер нежели БД? и бд даже в какой то мере будет простаивать?

И еще вопросик. С помощью Jmetr вообще возможно эмитировать конкурентные http запросы ( а в них запросы к БД), чтобы в большей мере сравнить innodb и memory таблицы по скорости?
Illusiony вне форума Ответить с цитированием
Старый 16.08.2016, 17:39   #20
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Итак я вот что протестировал:
Создал 3 таблички Memory и одну InnoDB
В memory по 1 записи с заполненным полем str_click, в табличке InnoDB 3 записи с заполненными полями str_click.

Пример memory:
Код:
CREATE  TABLE IF NOT EXISTS `admin_bd_avtopick`.`HSCrab_test3`  (
  `status` TINYINT (1) NOT NULL ,
  `data_xod` TIMESTAMP NOT NULL default '0000-00-00 00:00:00',
  `str_click` VARCHAR(120)NOT NULL ,
  `c_p` CHAR(32)NOT NULL ,
  `x` SMALLINT UNSIGNED NOT NULL ,
  `y` SMALLINT UNSIGNED NOT NULL 
)
ENGINE = MEMORY
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
Пример InnoDB:
Код:
CREATE  TABLE IF NOT EXISTS `admin_bd_avtopick`.`HSCrab_test_innoDB`  (
	`n` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `status` TINYINT (1) NOT NULL ,
  `data_xod` TIMESTAMP NOT NULL default '0000-00-00 00:00:00',
  `str_click` VARCHAR(120)NOT NULL ,
  `c_p` CHAR(32)NOT NULL ,
  `x` SMALLINT UNSIGNED NOT NULL ,
  `y` SMALLINT UNSIGNED NOT NULL, 
PRIMARY KEY (`n`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
А вот сами тестовые скрипты с включенной блокировкой для обоих таблиц:
Memory:
Код:
<?php
$start = microtime(true);
//ini_set('error_reporting', E_ALL);
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);

function generatePassword($length = 8){
	$chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
	$numChars = strlen($chars);
	$string = '';
	for ($i = 0; $i < $length; $i++) {
	$string .= substr($chars, rand(1, $numChars) - 1, 1);
	}
	 return $string;
	}
for($j = 1; $j <10000; $j++)
{
	if (rand(1,3)==1)
	{
	$table='HSCrab_test1';
	}else if (rand(1,3)==2)
		{
		$table='HSCrab_test2';
		}else
			{
			$table='HSCrab_test3';
			}
include 'connect_bd.php';
mysqli_set_charset($link, "utf8");
$s=mysqli_real_escape_string($link,$_GET['s']);
if (mysqli_connect_errno()) {
	echo json_encode("error 1");// работает
    exit();
}else 
{
$str_click=generatePassword(60);// Генерируем случайный control_pass
$sql = mysqli_query($link,"SELECT str_click FROM $table FOR UPDATE;"); // блокируем поле от изменений
$sql = mysqli_query($link,"SELECT str_click FROM $table "); //
$row = mysqli_fetch_array($sql);
$selest=$row[0];
$sql = mysqli_query($link,"UPDATE $table SET str_click = '$str_click'"); // добавляем изменения и перезаписываем
if ($sql) {
			} else {
				
			echo "не вставили".mysqli_error($link);
			}

}

}
$time = microtime(true) - $start;
printf('Скрипт выполнялся %.4F сек.', $time);
echo $time/10000;
?>
Для InnoDB:
Код:
<?php
$start = microtime(true);
//ini_set('error_reporting', E_ALL);
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);

function generatePassword($length = 8){
	$chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
	$numChars = strlen($chars);
	$string = '';
	for ($i = 0; $i < $length; $i++) {
	$string .= substr($chars, rand(1, $numChars) - 1, 1);
	}
	return $string;
	}
for($j = 1; $j <10000; $j++)
{
/*	if (rand(1,3)==1)
	{
	
	}else if (rand(1,3)==2)
		{
		$table='HSCrab_test2';
		}else
			{
			$table='HSCrab_test3';
			}
			*/
$nember=rand(1,3);
include 'connect_bd.php';
mysqli_set_charset($link, "utf8");
$s=mysqli_real_escape_string($link,$_GET['s']);
if (mysqli_connect_errno()) {
	echo json_encode("error 1");// работает
    exit();
}else 
{
$table='HSCrab_test_innoDB';
$str_click=generatePassword(60);// Генерируем случайный control_pass
$sql = mysqli_query($link,"SELECT str_click FROM $table FOR UPDATE WHERE n= '$nember' "); // блокируем поле от изменений
$sql = mysqli_query($link,"SELECT str_click FROM $table WHERE n= '$nember' "); //
$row = mysqli_fetch_array($sql);
$selest=$row[0];
$sql = mysqli_query($link,"UPDATE $table SET str_click = '$str_click' WHERE n= '$nember'"); // добавляем изменения и перезаписываем
if ($sql) {
			} else {
				
			echo "не вставили".mysqli_error($link);
			}

}

}
$time = microtime(true) - $start;
printf('Скрипт выполнялся %.4F сек.', $time);
echo $time/10000;
?>
В скрипте для Memory рандомно каждую итерацию выбиралась таблица, а в скрипте InnoDB рандомно одна из 3х записей.

Итог: скрипт Memory отрабатывает около 5 секунд, а InnoDB около 11-15 секунд.

Я конечно понимаю что тест далек от реальности, но хоть какое то сравнение. И наверняка есть существенные ошибки.

В общем так и так скорость очень велика выполнения всего скрипта и в частности запросов к БД. И наверное, мне нету резона делать все на сотнях таблицах memory и можно обойтись одной таблицей InnoDB с несколькими сотнями записей. Ввиду того, что все равно на каждую итерацию такого тестового скрипта будет приходится по 1 http запросу к подобному скрипту и, по видимому нагрузка на Http сервер будет на порядок( порядки) больше нежели на БД.

К тому же, наблюдал такую ситуацию: Нагрузка на проц при тесте Memory таблиц была 100%, а InnoBD держалась вблизи 66%. Очень интересно. Скорее всего это объясняется именно использования оперативной памяти и SSD. То есть проц простаивает из-за недостаточной скорости SSD.

Основные процессы mysql и apache2 в тесте Memory занимали соответсвенно 54/43 % а у InnoDB 40/20.

Загрузка Apache2 свзязано с выполнением PHP инструкций?

Последний раз редактировалось Illusiony; 16.08.2016 в 17:55.
Illusiony вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу, с помощью которой изображение будет разбиваться по пикселям и будет создаваться матрица andrey4515 Помощь студентам 2 08.01.2014 18:44
Будет ли сервер idTCP работать без веделенного внешнего ip (Delphi Indy) _PROGRAMM_ Помощь студентам 1 29.11.2010 13:52
какая структура *.icns?? Ntlegend Общие вопросы Delphi 3 02.09.2009 01:24
Учет оплаты. Какая формула будет если..? Anton_audit Microsoft Office Excel 5 12.08.2009 17:40
посчитать какая доставка для клинта 10-я? Delphi (Клиент-Сервер) Vindigo Помощь студентам 6 27.01.2008 15:28