Чтение RSS каналов

Форум

Открыть Ответить

PHP + MySQL - массив с циклом, апдейт записей БД

0

0
1
18.09.2018 21:49:0019.09.2018 17:09:06
Вопрос. Не совсем по движку.
Нужно обновить поле time во всех записях таблицы.
Вытащил выборку (id, time) в массив, и циклом сделал апдейт всех записей.

В итоге массив у меня содержал примерно 5000 записей.
А как поступают при записях в десятки или сотни тысяч?
4.35

4.35
2
19.09.2018 17:24:3019.09.2018 17:35:37
Почему заинтересовались данным вопросом?

Несколько лёгких/простых запросов в базу данных от одного пользователя, в нашем варианте, администратора/модератора не является проблемой! Сложности возникают, если этих пользователей становится более сотни, получаем 100 * 5000 = 500 000 запросов в базу данных Смайл - 13

В таком случае следует продумать логику составления запросов в БД. Можно воспользоваться хитрым методом, одного запроса. Ниже простой пример из справочника по системе:

Запрос, который удалит всех зарегистрированных пользователей, использующих IP адрес: 193.201.225.104. Данная возможность полезна для массового удаления спам ботов в случае их регистрации.

DELETE FROM {pref}_users WHERE user_last_ip = "193.201.225.104";


В данном запросе в базу данных, движок MySQL пройдётся по всем записям таблицы и соответственно проверит их на соответствие, при необходимости удалит. В этом варианте отпадает функция цикла PHP, что в свою очередь значительно ускоряет процесс.

Всем известная мудрость, самый короткий путь, как правило, является самым быстрым, но это в идеальных условиях! Как и везде есть свои нюансы, нужно ориентироваться по ситуации и исходить из поставленной задачи/цели.

О сколько нам открытий чудных,
Готовит просвещенья дух,
И опыт, сын ошибок трудных,
И гений, парадоксов друг...
3.22

3.22
3
19.09.2018 21:44:3019.09.2018 21:48:22
Та тут такой частный случай получился.
Вывод товаров в магазине идёт в порядке добавления их в базу с сортировкой по времени.
Так случилось, что большинство товаров было добавлено с интервалом 1 или ноль секунд.
И в один прекрасный момент человек, который добавлял товар ошибся.
И чтобы исправить ошибку. ему теперь требуется воткнуть товары в определённый временной интервал. А так как дельта для манёвров нулевая, то в случае их добавления потребуется корректировка времени у других (соседних) товаров.

Поэтому я взял выборку с order by time desc и затем автоматически переназначил всем новое время с интервалом в 5 секунд.

Сначала попробовал напрямую через whlie () { update }, но так как сортировка выборки была по обновляемому полю, то система глюканула.
Поэтому пришлось добавить массив в качестве временного буфера.

По поводу огромных баз.
Недавно начал реализовывать одну идею. Всё было хорошо, пока не пришло время точных подсчётов и тут расчёты выдали, что база должна содержать 566.111.106 записей.
Я даже не представляю как это реализовать, поэтому решил отложить и работать с "лёгкой" версией - в 644.506 записей. А с большой - решать проблемы по мере поступления.
4.35

4.35
Открыть Ответить
Хотите опробовать SLAED CMS в действии?

Технологии

PHP MySQL HTML 5 CSS 3 jQuery jQuery UI

Контакты

  • D-49179, Deutschland
    Ostercappeln, Im Siek 6
  • +49 176 61966679

  • https://slaed.net
Идеи и предложения
Обратная связь