Как можно сгенерировать список от 0001 до 9999 и записать их в базу в колонку WebsiteId.
Изначально я создал список средствами PHP, и потом просто вставил в базу, но далее столкнулся с тем, что требуется сгенерировать список от 00000001 до 99999999 его также можно сгенерировать через PHP но требуется большой объем памяти, но даже если это решить, как потом записать такой объем данных в БД?
Язык SQL не занимается списками. Если ты хочешь быть в терминологии - то попробуй описывать задачу используя такие термины как table, view, table-function, cursor.
То что ты хочешь реализовать требует уточнений. Эти 10 миллионов datarows уже есть?
Со стороны задача выглядет слишком уж синтетической. Зачем вставлять пустые ключи без дополнительных атрибутов? Какая будет в них польза?
mayton2019, Мне нужно создать всевозможные комбинации, это требуется для моей задачи. Далее я буду по Cron выбирать из базы значения и делать запрос на определенный url адрес, можно сказать хочу перебрать все возможные комбинации и собрать всю информацию по ним.
Попробуйте запустить на PHP и расскажете как у вас дела, а потом попробуйте взять этот огромный список и загрузить в базу и тоже расскажите получилось ли, если да, поделитесь методом как загружали его в БД.
mayton2019, роль базы данных в том, что для сработавших комбинаций я записываю всю необходимую информацию о данном ID. Кроме того, в базе я могу отмечать был ли проверен данный ID или еще нет, это выборка как минимум нужны для того, чтобы поставить крон задание и он потихоньку выполнял запросы пока в базе не будут проверены все ID
mayton2019, какое это имеет значение? Вопрос темы: Как заполнить нужными мне комбинациями базу данных.
Даже если проверка одного ID занимает 1 секунду, то вы собираетесь создать такое количество запросов в одну секунду к определенному сайту? Для этого и делаю базу, чтобы можно было настроить крон и по 100 шт выбирать, проверять и отмечать в базе, что они проверены, далее берем следующие 100 итд
Дмитрий, так нужно создать эти записи в базе) в этом вопрос. Я попытался загрузить разом все сгенерированные комбинации, но не удается, видимо запрос слишком большой.
aopil, еще раз - у вас таблица. по крону запускается скрипт - он заходит в таблицу берет max(websiteId) и начинает в цикле i=max, i < max + 100 дергать сайт. Зачем заранее генерировать - а не только когда это понадобиться?
какое это имеет значение? Вопрос темы: Как заполнить нужными мне комбинациями базу данных.
Даже если проверка одного ID занимает 1 секунду, то вы собираетесь создать такое количество запросов в одну секунду к определенному сайту? Для этого и делаю базу, чтобы можно было настроить крон и по 100 шт выбирать, проверять и отмечать в базе, что они проверены, далее берем следующие 100 итд
я решал задачу подобную твоей. Я парсил мемберов одного сайта. Просто ради интереса. Мне нужен был список мемберов. Так вот их было порядка пол-миллиона и я не стал заводить на каждого JobId. Я просто разбил их на сотни и каждую пачку объявил отдельной запистью в БД. Учетная запись парсилась меньше секунды и почти за минуту мой парсер отрабатывал пачку и ставил в базе отметку. Это удобно. Я не мельчил. Если джоб прерывался на пол-пачки - я просто перезапускал его заново. Процесс - идемпотентный тоесть я имею право запускать его сколь угодно много.
mayton2019, если я правильно понял, то вы предлагаете разбить 99999999 моих строчек на пачки по 50-100 шт и таким образом уменьшить количество создаваемых в базе полей?
aopil, вы можете делать как угодно. В конце концов вы - автор этой затеи. А если бы ваш ID был UUID со 128 битами эффективной емкости то тогда наверное для твоей базы не хватило-бы ресурсов планеты Земля.
Вобщем делай как хочешь просто меня удивила твоя арифметика. И предварительная генерация. Тоже вобщем ресурсоёмкое и безсмысленное действо. Вроде как никакой пользы приложение еще не выдало но уже 10 млн datarows записало. Вот как-то так.
mayton2019, Можете показать, как вы создавали список пачек? В целом, такое я думаю можно сделать, но так или иначе нужно записывать данные в базу и брать от туда эти пачки, как по другому то))
Создавал я скриптом на python. Одноразовый скриптик. Я его сохранил результат в текстовый SQL файл.
Потом вызвал из psql и у меня были созданы 5000 пачек пользователй в каждой по 100 штук. И того пол миллиона пользователей.
Скрипт выглядит как-то так.
insert into job_param values(1,100, "ready");
insert into job_param values(101,200, "ready");
.....
Потом статусы работали "ready" -> "in progress" -> "done"
aopil,
Лично мое мнение -
В вашей задаче нет проблем, если вы с нуля создаете 99 млн строк не так много. Только ключи изначально отключите.
И для php - генерируйте по 1000 - 10000 строк и загружается списком.
Но я бы написал функцию на MYSQL. быстрее можно.
С другой стороны, а что вам мешает на уровне приложения, по требованию, создавать запись? А не выпендриваться с кучей пустых значений в базе?
Мне нужно создать всевозможные комбинации, это требуется для моей задачи.
Тебе НЕ нужно создавать эти комбинации.
Далее я буду по Cron выбирать из базы значения и делать запрос на определенный url адрес, можно сказать хочу перебрать все возможные комбинации и собрать всю информацию по ним.
Из БД прекрасно можно выбирать значения, которые ОТСУТСТВУЮТ. Именно это и нужно делать. А вот собранную информацию уже можно класть в БД - и при следующей выборке эти значения уже не будут возвращаться, потому что не являются отсутствующими.
Значит так. Проблем в задаче никакких нет. Автор пишет про большой объем памяти. Это означает что он пытается сохранить данные в memory. Этого не надо делать. Надо вставлять сразу. Если PHP это делает медленно - то почитать про batch-insert. Или лучше сделать как я предложил.
Создать поточно sql-файл с inserts. Таким подходом можно грузить и тера-байты и петабайты.
Итак, вижу такие варианты:
1. Создавать и грузить записи по 1000. Операция одноразовая, так что не важно, сколько времени она займет.
2. Силами php создать файл sql и один раз загрузить его.
3. Создавать записи при первом запросе.
4. Накуривать запрос sql для генерации записей.
Выбирайте что вам понятнее. =)
Ну и таких пачек у меня вышло аж 2083967 т.к. мне требуется 4,5,6,7,8 значные числа собрать тоже. Ну и теперь вытаскиваю из БД первую пачку и скрипт её обрабатывает и отмечает, что она проверена, далее берем следующую пачку и тд.
Для правильного вопроса надо знать половину ответа
INSERT INTO `table` (`WebsiteId`)
WITH RECURSIVE `cte` (`num`) AS (
SELECT 1
UNION SELECT `num` + 1
FROM `cte`
WHERE `num` < 9999
)
SELECT `num`
FROM `cte`