Задать вопрос

Как устранить проблему пропусков при записи в myisam таблицу?

Здравствуйте все, кто еще не спит. У меня проблема при вставке в таблицу данных. Данные храню в myisam таблице. Читал, что она, якобы, не такая отказоустойчивая, как дефолтная, но не может же она давать сбой при 100000 записях? В общем, получаю данные со стороннего сервера в виде json. Затем парсю в массив и добавляю бд. Думал, что может быть не все запросы прошли успешно, но нет, все нормально. В пределах одного массива(2000 записей) часть записывается, часть нет. Не знаю что и делать. Хотел потестить innodb, но не рискнул) Уж очень он медленный. На 40.000 записей innodb справляется на ура, больше - начинает пропускать. Прошу не судить строго, только пару дней назад узнал, что в myisam insert и select работает значительно быстрее, нежели в innodb. Никогда не работал с большим объемом данных.
  • Вопрос задан
  • 2732 просмотра
Подписаться 6 Оценить 2 комментария
Решения вопроса 1
Assargin
@Assargin
Перед ответом смотрю наличие ✔ в ваших вопросах
InnoDB - транзакционное хранилище, и если вы явно не стартуете транзакцию, каждый ваш запрос неявно оборачивается в транзакцию (если не настраивать это иначе, в вашем случае, думаю такого не было). Если вы начнете явно открывать транзакцию перед вставкой ваших многих тысяч записей, и в конце коммитить, прирост по скорости будет раз в 100. Попробуйте так для начала, а про пропуски звучит, если честно, бредово как-то.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
metamorph
@metamorph
Как именно вставляете? Есть ли ошибки в логах?
Проблема может быть где угодно, вплоть до лимита на время выполнения скрипта.
Попробуйте для разнообразия сохранить данные в локальный файл и импортировать его из консоли.
Ответ написан
Mu57Di3
@Mu57Di3
У меня есть подозрение что из за большого количества инсертов очередь выполнения сервера набивается запросами и они банально долго выполняются, даже тогда когда вы думаете что все данные обработаны, но она на самом деле еще в только собираются вставится.

Одним инсертом можно ставить несколько строк. Тоесть все тоже INSERT INTO tt(id, tt_id, preview, category, type) VALUES (?,?,?,?,?), только после values через запятую скобки с данными и таким образом зараз по 500-1000 записей, это отработает быcтрей чем 500 одиночных инсертов.

И всетаки рекомендовал перейти таки на InnoDB он понадежней и быстрей выполняет сложные выборки.
Ответ написан
Fragster
@Fragster
помогло? отметь решением!
Вот моя заляпуха для PDO, которая содержит две функции:
подстановка массива в placeholder, чтобы можно было использовать условие вида IN(:placeholder:)
и вставку сразу нескольких строк (insert into tt (...) values (...),(...),(...))
pastebin.com/BYwSW2GZ

оба варианта предполагают именованные плейсхолдеры.
с помощью нее проблема скорости вставки может быть решена, так как вставка одним запросом 100-1000 строк намного эффективнее. Количество строк зависит от максимального размера запроса в конфиге мускуля.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы