Вопрос:
Поэтому для целей разработки мне нужно иметь таблицу размером от 1 миллиона до 100 миллионов, мой текущий метод не является быстрым.
Что обычно делают разработчики, чтобы иметь свои таблицы с миллионом строк, чтобы проверить, как быстро их программа может справиться с ними?
Мой текущий метод имеет 10 для циклов, но он очень медленный для количества строк, которые мне нужны.
Итак, что я могу сделать, чтобы быстро вставить миллионы строк? Что делают разработчики в этом случае?
Ответ №1
Обычно самая медленная часть вставки обновляет индексы. Чтобы ускорить массовые вставки, отключите индексы, отправьте вставки, а затем снова включите их.
Кроме того, используйте один из синтаксисов с несколькими вставками, а не выдавать INSERT для каждой отдельной строки.
Ответ №2
Я думаю, вы вставляете свои записи, как показано ниже:
INSERT INTO ‘table1’ (‘field1’, ‘field2’) VALUES («data1», «data2»); INSERT INTO ‘table1’ (‘field1’, ‘field2’) VALUES («data1», «data2»); INSERT INTO ‘table1’ (‘field1’, ‘field2’) VALUES («data1», «data2»); INSERT INTO ‘table1’ (‘field1’, ‘field2’) VALUES («data1», «data2»); INSERT INTO ‘table1’ (‘field1’, ‘field2’) VALUES («data1», «data2»);
Вместо этого используйте это:
INSERT INTO ‘table1’ (‘field1’, ‘field2’) VALUES («data1», «data2»), («data1», «data2»), («data1», «data2»), («data1», «data2»), («data1», «data2»);
Примечание. Чтобы оптимизировать скорость вставки, объедините множество небольших операций в одну большую операцию. В идеале вы делаете одно соединение, отправляете данные для многих новых строк одновременно и задерживаете все обновления индексов и проверку согласованности до самого конца.
Ответ №3
- Создать скрипт для генерации данных
- Использовать вывод для вставки в базу данных
- Просто запустите ночь
- Наслаждайтесь этой пинтой, когда она делает свой материал
Ответ №4
Из вашего вопроса неясно, какова природа данных, которые вам нужно вставить, но если она может быть сгенерирована “на лету”, а самый быстрый способ – сделать в одном запросе (который будет вставлять 1 млн. Клиентов), как это
INSERT INTO customers (id, customer_name) SELECT n, CONCAT(‘Customer’, n) FROM ( select a.N + b.N * 10 + c.N * 100 + d.N * 1000 + e.N * 10000 + f.N * 100000 + 1 N from (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) b , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) c , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) d , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) e , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) f ) t
Вот демоверсия SQLFiddle для строк 10 тыс.
Рекомендуемое чтение:
- MySQL: эффективно заполнять таблицу в хранимой процедуре
- Скорость заявлений INSERT
Ответ №5
Самое быстрое решение – не загружать данные вообще, а начинать с предварительно заполненного каталога данных.
Если вы просто инициализируете данные для разработки/тестирования, не загружайте данные вообще. Запустите новый экземпляр MySQL из физической резервной копии.
Вы можете использовать Percona XtraBackup для физической резервной копии любого исполняемого экземпляра MySQL без блокировки трафика.
Затем подготовьте резервную копию и мгновенно можно использовать в качестве каталога данных с данными.
Затем вы можете установить новый тестовый экземпляр так быстро, как вы можете запустить cp чтобы скопировать этот каталог данных, и запустить экземпляр mysqld, указав –datadir на свою копию резервной копии.
Вы можете повторить это, скопировав физическое резервное копирование на такое количество экземпляров dev/test, сколько вам нужно.
Второй вариант: не используйте INSERT, используйте LOAD DATA INFILE. Это может быть на порядок быстрее, чем использование INSERT, даже с подготовленными операторами и многострочным синтаксисом.
Третий вариант: подготовьте свои данные в виде CSV файла, переместите его в свой каталог данных MySQL, затем создайте таблицу с ENGINE=CSV указывающую на этот файл. Вуаля, у вас есть таблица с данными. Затем используйте ALTER TABLE ENGINE=InnoDB и преобразуйте его в реальную внутреннюю таблицу.