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

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

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2013, 09:58   #1
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию Вопрос о приоритете скорости разными методами отправки в базу данных

Здравствуйте уважаемые программисты.
Суть вопроса.
Как лучше действовать чтоб выиграть в скорости загрузки данных в саму базу данных.

Как Я понимаю, что имею два метода.

1. Через PHP скрипт
PHP код:
<?php
$start 
microtime(true);
$mysqli = new mysqli("localhost""root""Тут пассворд""password");
ini_set('memory_limit''1999M');
ini_set('max_execution_time''9999999');
$filename 'log.txt';
$i=0;
$error 0;
$file1 file('ALL_TEXT3.txt');

foreach(
$file1 as &$r){

$r explode(":" ,$r);

  
    
$a "INSERT INTO login (name, pass) VALUES ('{$r['0']}','{$r['1']}'); ";
    
$handle fopen($filename'a');
    if (
$mysqli->query($a)) {
        
$i++;
    }  else 
    {
        
fwrite($handle$a);
        
$error++;
    }
  }


$mysqli->close();
echo 
"Всего запрособ обработано - $i<br />";
echo 
"Ошибок в запросе - $error<br />";
if (
$error 0) {
echo 
" (сохранено в файл $filename)<br /> ";
}
$time microtime(true) - $start;
printf("Средняя скорость запросов -  $i/  %.2F (запрос/сек) <br>"$time);
printf('Всё время выполнения - %.2F сек.<br />'$time);

?>

Вариант 2.
Привести всю базу к однообразному виду SQL запроса.
То есть в файле у меня храниться данные в виде login:pass
С начала перегнать их вид SQL запроса, опять же используя PHP скрипт для этого.
Код:
INSERT INTO login (name, pass) VALUES ('login','password');
А потом импортировать в саму БД.

Кажись всё просто, но это если их 500 штук.
А если 5 миллионов то тут время уже играет роль.
Какой способ лучше на ваше мнение?
И что можете порекомендовать с настройками для повышения скорость между PHP->MySQL.
Спасибо.

Последний раз редактировалось Jleksern; 01.09.2013 в 10:00.
Jleksern вне форума Ответить с цитированием
Старый 01.09.2013, 10:21   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

1. в мускуле есть станадртные средства загрузки из csv файлов - LOAD
2. если все же php+mysql - то нужно готовить запросы по 100-200 записей одновременно... тогда у вас будет на 5 млн запросов а 50 тыщ
ADSoft вне форума Ответить с цитированием
Старый 01.09.2013, 10:26   #3
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
2. если все же php+mysql - то нужно готовить запросы по 100-200 записей одновременно... тогда у вас будет на 5 млн запросов а 50 тыщ
В смысле в одном файле чтоб было 100-200 записей?)
Если так, то в этом случае у меня будет в папке храниться сотни тысячь текстовых файлов по 200 записей.
Или имеется в виду ещё один поток импортирования в базу?
Jleksern вне форума Ответить с цитированием
Старый 01.09.2013, 10:32   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

имеется ввиду что запрос динамически строить в цикле....
Код:
INSERT INTO login (name, pass) VALUES ('login','password'), ('login','password'), ('login','password'), ('login','password');
итд 100 записей... и потом только исполнять запрос
ADSoft вне форума Ответить с цитированием
Старый 01.09.2013, 10:40   #5
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
имеется ввиду что запрос динамически строить в цикле....
Код:
INSERT INTO login (name, pass) VALUES ('login','password'), ('login','password'), ('login','password'), ('login','password');
итд 100 записей... и потом только исполнять запрос
Уловил Вашу идею.
Отличная идея.
Нужно будет придумать реализацию такого скрипта.
Jleksern вне форума Ответить с цитированием
Старый 01.09.2013, 10:47   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

стандартный подход...
ADSoft вне форума Ответить с цитированием
Старый 05.09.2013, 14:28   #7
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию

Товарищи, с горем пополам был создан такой скрипт.
PHP код:
<?php
$start 
microtime(true);
$mysqli = new mysqli("localhost""root""""password");
ini_set('memory_limit''1999M');
ini_set('max_execution_time''999999');
$filename 'log.txt';
$i=0;
$error 0;
$file1 file('Import/xab4.txt');
$a "";

foreach(
$file1 as &$r){
$r explode(":",$r);
$log $r[0]; $pas $r[1];
if (
$i%50 == 0)
{
if(
$i)
{
$a .= ";";
 
// echo $a . "</br></br>";
  
$mysqli->query($a);
}
$a "INSERT INTO login (name, pass) VALUES ('$log', '$pas')";
}
else
{
$a .= ",('$log', '$pas')";
}
$i++;
}
if (
$i%50)
{
$a .= ";";
 
// echo $a . "</br></br>";
 
$mysqli->query($a);
}


$mysqli->close();
echo 
"Всего запрособ обработано - $i<br  />";
echo 
"Ошибок в запросе - $error<br />";
if (
$error 0) {
echo 
" (сохранено в файл $filename)<br /> ";
}
$time microtime(true) - $start;
printf("Средняя скорость запросов -  $i/  %.2F (запрос/сек) <br>"$time);
printf('Всё время выполнения - %.4F сек.<br />'$time);

?>
Итог: Скорость увеличилась в десятки раз. Мне чтоб загрузить 10 миллионов ушло 1-2 часа. Пару дней назад, с старыым скриптом импорт был 3 дня, для загрузки 10 миллионов.
Но появилась и проблема.
У меня компьютер зависать начал, на столько что курсор перестает двигаться.
ОС Ubuntu. Озу 2 гига. База данных mariadb, Php 5.4, Apache/2.2.22

На какие настройки нужно воздействовать, для решения проблемы?
Jleksern вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос о скорости PDO ? Haroutweb PHP 1 25.08.2012 12:35
программа для измерения скорости ввода данных с жесткого диска dark23 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 21.06.2012 09:54
Частота отправки данных в UDP alexlogvinenkoit C/C++ Сетевое программирование 10 11.05.2012 15:17
Вычисление опред.интеграла разными методами(С++) Knok69 Помощь студентам 0 08.05.2010 20:29