Insert multiple rows

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
gentle7t
Сообщения: 5
Зарегистрирован: 2017.11.15, 21:44

Insert multiple rows

Сообщение gentle7t »

Здравствуйте, подскажите как оптимальне(быстрее) всего залить 2000000 тестовых записей в базу? Батчинсерт постоянно дает выхлоп по памяти, когда убрпал ограничение, то все отработало, но ничего не залило. Я пробовал изначально работать с одним объектом и сейвить по одной записи(setIsNewRecord в начале каждой итерации), но это очень долго. И ещё один вопрос, надо будет создать ещё примерно 3-4 миллиона данных и связать их с вышеупомянутыми 2кк рандомно, то есть создавая вторую сущность связать её внешним ключем с первой случайным образом. Как это все оптимизировать? Я понимаю что сид базы происходит очень редко, но всё же это очень долго.
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Insert multiple rows

Сообщение azz »

Как по мне, это лучше сделать средствами бд
gentle7t
Сообщения: 5
Зарегистрирован: 2017.11.15, 21:44

Re: Insert multiple rows

Сообщение gentle7t »

azz писал(а): 2017.11.15, 22:36 Как по мне, это лучше сделать средствами бд
Можно как-то генерировать нормальные имена и фамилии например? С помощью фейкера получается более менее что-то нормальное сгенерить
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: Insert multiple rows

Сообщение kawabanga »

Можно как-то генерировать нормальные имена и фамилии например? С помощью фейкера получается более менее что-то нормальное сгенерить
https://randomuser.me/api/?results=1000&nat=US
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Insert multiple rows

Сообщение Nex-Otaku »

Можно просто в PHP-скрипте сделать вывод в SQL-файл, а файл потом в консоли загрузить в БД.
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Insert multiple rows

Сообщение someweb »

Вот такой код миллион записей заливает без проблем

Код: Выделить всё

        $transaction = Yii::$app->db->beginTransaction();
        try {
            foreach ($select as $row) {
                extract($row);
                $update->execute();
                $updatedRowCount++;
                if ($updatedRowCount % 5000 === 0) {
                    $transaction->commit();
                    $transaction = Yii::$app->db->beginTransaction();
                }
            }
            $transaction->commit();
        } catch (\Throwable $ex) {
            $transaction->rollBack();
            throw $ex;
        }

$update здесь вида

Код: Выделить всё

         INSERT INTO table_name (id, field_name)
             VALUES (:id, :field_name)
             ON DUPLICATE KEY UPDATE
             field1 = :field_name
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Ответить