За последние 24 часа нас посетили 41870 программистов и 7145 роботов. Сейчас ищут 1294 программиста ...

BIG INSERT in MySQL 100 000 rows

Тема в разделе "MySQL", создана пользователем VladimirPivovar, 3 апр 2011.

  1. VladimirPivovar

    VladimirPivovar Активный пользователь

    С нами с:
    6 мар 2011
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Беларусь
    Как сделать быструю вставку 10 - 100 тысяч записей в MySQL?

    Если сразу нельзя сделать, то какими порциями подавать и через что (буфер, спец команда )
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    можно файл скормить насколько я знаю. опыта не имел.
     
  3. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.446
    Симпатии:
    1
    импорт/экспорт дампа ? не ?
     
  4. VladimirPivovar

    VladimirPivovar Активный пользователь

    С нами с:
    6 мар 2011
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Беларусь
    "импорт/экспорт дампа ? не ?"

    нет.
    Мое приложение делает поиск среди миллионов, миллиардов записей, данные хранятся вобще в файлах жесткой структуры, надо сделать быстрый инсерт в MySQL, через цикл идет очень медленно

    может кто нибудь приведет примерный код,
    как из массива данных из кода отправить в хранимую процедуру MySQL
     
  5. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.785
    Симпатии:
    2
    Адрес:
    Ташкент
    возможно поможет LOAD DATA INFILE http://dev.mysql.com/doc/refman/5.1/en/load-data.html
    но точно не в хранимую процедуру. можно сделать триггер на вставку - работает также как и хранимка
     
  6. VladimirPivovar

    VladimirPivovar Активный пользователь

    С нами с:
    6 мар 2011
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Беларусь
    "но точно не в хранимую процедуру"
    а почему нет?
     
  7. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.370
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    хз, 10-100к записей не проблема даже для INSERT ... VALUES
     
  8. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.547
    Симпатии:
    0
    Адрес:
    Мариуполь
    VladimirPivovar
    Так а приложение отваливается на каком то этапе? Или в чем затык?
     
  9. evgeny12000

    evgeny12000 Активный пользователь

    С нами с:
    22 фев 2010
    Сообщения:
    22
    Симпатии:
    0
    100 000 совсем не много.

    Используйте:

    Мultiple insert (для InnoDB)
    INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

    Мultiple delayed insert (для MyISAM)
    INSERT DELAYED INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
     
  10. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    http://sypex.net/ - я использую урезанную версию для сайтов, очень удобный скрипт.
     
  11. VladimirPivovar

    VladimirPivovar Активный пользователь

    С нами с:
    6 мар 2011
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Беларусь
    "Так а приложение отваливается на каком то этапе? Или в чем затык?"

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

    если я поставлю поиск - выбрать те записи, в которых люди заходили в интернет за полгода,

    то через цикл инстерт ооочень медленно проивзодится, сводит скоро поиска на нет.... т е за сек 10 вставится порядка 500 записей, я за это время успею 5 файлов обработать при другом условии поиска, допусти выбрать записи, в которых звонил кокретный абонент за конр период времени....

    попробую
    сделать как Вы предложили:

    Мultiple delayed insert (для MyISAM)
    INSERT DELAYED INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

    только вопрос , до какого размера стринговый буфер накапливать до 1000 скобок со значениями для вставки внутри ?
    никаких дополнительных команд до и после этой команды не надо вводить?
     
  12. VladimirPivovar

    VladimirPivovar Активный пользователь

    С нами с:
    6 мар 2011
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Беларусь
    Почему я такое внимание уделяю этому моменту

    все дело в том, что я делаю SELECT и в коде пробегаю по каждой строке выборки, сравниваю, если удовлетворяет условию -

    сохраняю в коллекцию ( Vector) а потом достаю из коллекции по 1 му значению и формирую запрос на INSERT или UPDATE...

    Т е очень очень часто я буду делать многочисленные вставки INSERT и обновления UPDATE через язык Cи
    на десятках а то и сотнях тысяч строк
     
  13. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Максимум возможного при вставке большого объёма, можно получить по разному. Например,
    - InnoDB (или т.п.) - в пределах транзации вставлять несколько сотен/тысяч записей: даёт ~5000 зап/сек (+/-)
    - Тот самый "Мultiple delayed insert" - также отомарная вставка нескольких записей. По скорости даст такой же порядок величины.
    Ну ещё пара вариантов возможна.