Самый быстрый способ вставить 134675 значений в удаленную базу данных - PullRequest
5 голосов
/ 03 июня 2011

У меня есть массив с более чем 134675+ значениями, мне нужно вставить их в мою таблицу MySQL.Я знаю все, что нужно для работы с PHP и вставкой данных MySQL.Есть ли быстрый метод, который позволил бы мне вставить все эти значения на удаленном сервере в течение 30-60 секунд?потому что, когда я пытаюсь сделать это методом foreach, страница перестает работать.Удаленный сервер не позволяет соединениям с БД сохраняться более 60 секунд.Я не знаю почему.Поэтому, пожалуйста, помогите мне с быстрой логикой.

Вот некоторый код, который я попробовал:

foreach($array as $value)
{
    $sql="insert into collected values('".$value."')";
    $res=mysql_query($sql);
    //then some extra code.
}

ПРИМЕЧАНИЕ У меня не так много прав доступа на сервере.Моя учетная запись БД может только вставлять значения и не более того.И это ограничение на БД mySQL.Я не могу использовать CSV или любую другую вещь.

Ответы [ 4 ]

15 голосов
/ 03 июня 2011

Вы можете включить в свой цикл функцию mysql_ping(). Эта функция проверяет, открыто ли соединение, а если нет, оно повторно подключается.

Используя собственный пример, вы можете сделать что-то вроде:

foreach($array as $value) {
    mysql_ping($dbconn);
    $sql="insert into collected values('".$value."')";
    $res=mysql_query($sql);
    //then some extra code.
}

Редактировать : Следует отметить, что в соответствии с документами, после MySQL 5.0.14, PHP не переподключается автоматически. Если вы используете более новую версию MySQL, вам придется добавить свою собственную логику подключения, возможно, так (я не проверял):

function check_dbconn($connection) {
    if (!mysql_ping($connection)) {
        mysql_close($connection);
        $connection = mysql_connect('server', 'username', 'password');
        mysql_select_db('db',$connection);
    } 
    return $connection;
}

foreach($array as $value) {
    $dbconn = check_dbconn($dbconn);
    $sql="insert into collected values('".$value."')";
    $res=mysql_query($sql, $dbconn);
    //then some extra code.
}
3 голосов
/ 03 июня 2011

Я думаю, было бы лучше, если бы вы поместили свои значения в файл CSV и использовали синтаксис загрузки данных.

edit.Пример

Предположим, у вас есть текстовый файл со всеми вашими значениями

value1
value2
value3
and so on

После того как вы создадите структуру таблицы

create table mytest (
id int not null auto_increment primary key,
myvalue varchar(50)
) engine = myisam;

и загрузите свой текстовый файл, вы можете сделатькак то так

load data infile 'myfile.txt'
into table mytest (myvalue);
0 голосов
/ 03 июня 2011

Если вы можете использовать транзакции MySQL и запускать запросы партиями, скажем, по несколько сотен за раз, это может повысить надежность и скорость вставки.

0 голосов
/ 03 июня 2011

Я думаю, что ответ @ nick лучший, но, возможно, альтернативой может быть написание SQL для создания SP, который перечисляет все вставки, то есть в виде большой строки, отправляет их по проводам, выполняет SP и удаляет его.

Я сам специалист по MSSQL, и я бы никогда не порекомендовал это - но это тот тип сумасшедшего хака, который мне пришлось использовать на проходе, когда я не мог полагаться на собственный бренд MSSQL с функциональностью массовой загрузки.

В качестве альтернативы вы можете построить несколько операторов вставки в SQL и отправить их как одну команду в БД? Снова извините, но не эксперт MySQL, но это возможно в других базах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...