как сделать быстрей ? коннекты к БД

sanya_php

Новичок
как сделать быстрей ? коннекты к БД

скрипт делает следующее:

большой цикл обработки текстового файла, в файле 120тыс строк. каждая строка переносится в БД.
скрипт запускается кроном, так чтобы не заносить в БД повторяющиеся строки стоит такая проверка:


mysql_connect($hostName, $userName, $password)
mysql_select_db($dbName)
$sql = "SELECT domain FROM `rool` where dom='$dom'";
$result = mysql_query($sql);
if(mysql_num_rows($result)>0) { $ischecked=1;} else $ischecked=0;
mysql_close();

ну и дальше если $ischecked=0 то строка заносится в БД также коннектом и закрытием коннекта к БД.
первые 5000 строк обработались быстро. Затем торможение жуткое пошло.
В чем трабл ? как ускорить ?
 

MaxiStyle

Новичок
А где в вашем коде INSERT?

По-моему лучше так.
1. Создаем массив с данными из файла
2. Сравниваем массив с данными в БД, повторяющиеся строки удаляем из массива.
3. Затем создаем запрос с расширенным INSERT.

Вычислите где увас тормоза.
В момент чтения из файла. (по моему опыту 10-15%).
В момент сравнивания с БД. (20-30%).
Вставка (все остальное время).
 

sanya_php

Новичок
По-моему лучше так.
1. Создаем массив с данными из файла
2. Сравниваем массив с данными в БД, повторяющиеся строки удаляем из массива.
3. Затем создаем запрос с расширенным INSERT.
ну не знаю. этож надо будет переписывать весь код.
Суть состоит сейчас в том, как лучше: несколько коннектов к базе данных внутри цикла либо 1 коннект и 1 закрытие коннекта по выполнению цикла.

-~{}~ 10.04.08 04:02:

выполнение скрипта выбивается принудительно через 300 секунд. max_exec_time или как оно там правильно в php.ini

-~{}~ 10.04.08 04:10:

даже не 300 секунд а 30
 

dr-sm

Новичок
ключевые слова:
start transaction
commit
insert ignore
делать все все в одном соединении
 

Фанат

oncle terrible
Команда форума
не понял, при чем здесь замысловатый код из первого сообщения.

sanya_php, выясняешь, в каком именно месте у тебя "жуткое торможение".

как лучше: несколько коннектов к базе данных внутри цикла либо 1 коннект и 1 закрытие коннекта по выполнению цикла.

Какая связь с "жутким торможением"?
И, если оно жуткое, то почему нельзя проверить и убедиться сразу?
 

MaxiStyle

Новичок
sanya_php
Один коннект наверняка лучше... А один запрос еще лучше. А цекле делать не запросы, а создавать запрос, а в конце запроса его выполнять.

dr-sm
Транзакции у него пойдут только на InnoDB, а с ней время выполнения увеличится раз в 5.
 

vovanium

Новичок
MaxiStyle
Транзакции у него пойдут только на InnoDB
Есть еще INSERT IGNORE ;) Делаешь индекс по полям которые должны быть уникальны (если его нет) и заливай себе всё подряд, MySQL лишнего не добавит.
 

MaxiStyle

Новичок
vovanium
Конечно не создавать индексы при вставке ускорит операцию, но все равно сам механизм транзакции тормозить будет.
InnoDB очень медленный на вставках. Сам сталкивался с ним. 10000 записей (1 primary и 20 var без индексов) тормозят секунд на 10-15.
 

dr-sm

Новичок
Автор оригинала: MaxiStyle
....сам механизм транзакции тормозить будет.
:eek: как это?
оптимально, имхо, в данной ситуации,
класть несколько тыщ записей в одной транзакции,
а если ты будешь пихать в иннодб с врубленым автокоммитом,
то ясное дело будет тормозить.
 
Сверху