LINUX.ORG.RU

замедляется for с каждым проходом

 , ,


0

2

День добрый

имеется 2 базы mysql и скрипт осуществляющий копирование одной таблицы.

в исходной таблице 500к записей

скрипт выбирает 5к записей из исходной таблицы, и делает 1 инсерт 5к записей в новую таблицу.

проблема в том что первые 100к записей копируются со скоростью 10к записей в секунду а последние 100к со скоростью 5к записей в 2 секунды.

в чем может быть проблема?

в скрипте? в Mysql? в операционке?

по top\htop процессор все время выполнения висит в 95%, память на одном и томже уровне( гдето 70%)

селект примерно такой

select * from table limit 0,5000

0 это переменная, которые с каждым проходом цикла увеличиваются на +5к.

если поможет, могу запостить код.

Ответ на: комментарий от Radjah

каких кешей? где?

в сервере? так память на месте стоит и не увеличивается.

в Mysql?

в коде?

diakon2
() автор топика
Ответ на: комментарий от vividsnow

вот прямые запросы в базу, без скрипта

select * from statistic limit 0,5000;

5000 rows in set (0.01 sec)
select * statistic limit 450000,5000;

5000 rows in set (0.28 sec)

я так понял ничего не поделать? прям вообще ничего?

просто если я селектить буду по 1к а не по 5к и записей будет не 500к а 5кк то масштаб проблемы будет еще более глобальный?

diakon2
() автор топика
Ответ на: комментарий от beastie

за ссылку спасибо, все наглядно, с графиками и примерами, вот только на английском и ничего непонятно( можно в двух словах обьяснить что можно сделать?

допустим в исходную таблицу я могу давать только селекты. навешивать нвоые индексы или еще что я не могу.

diakon2
() автор топика
Ответ на: комментарий от diakon2

зачем тебе такая постановка задачи ? Если хочешь копировать таблицу полностью - используй COPY. Если по каким-то условиям - конкретизируй условия ( например за день, час, минуту, и т п)

Jopich1
()

Если есть индексы в базе, то чем больше записей уже в ней есть - тем дольше будут проходить инсерты.

Перед миграцией:
SET foreign_key_checks = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;

После переноса:
SET foreign_key_checks = 1;
SET UNIQUE_CHECKS = 1;
SET AUTOCOMMIT = 1;
COMMIT;

P.S. Это работает только в рамках одного соединения.

karaien ★★
()
Последнее исправление: karaien (всего исправлений: 2)
Ответ на: комментарий от karaien

индексов в базе нет, перед копирование создается структура идентичная структуре исходной базы. индексов в ней нет

пс. база mssql (mariadb последней версии для centos из репозиториев)

diakon2
() автор топика
Ответ на: комментарий от karaien

у него проблема с селектами, как решать више уже дали ссылку

kiotoze ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.