Удаление записи из БД для того чтобы размер БД не превысил установленный размер

ВладимирЧе

Новичок
Удаление записи из БД для того чтобы размер БД не превысил установленный размер

Планирую сделать такую штуку:
php-скрипт берёт rss-новости и выкладывает их на мой сайт.
Потом я решил сделать архив новостей,
то есть 1 раз в день при помощи cron запускается
php-скрипт который скачивает rss-новости и добавляет
их в базу данных MySQL. При этом поскольку место
на хостинге не резиновое надо следить за тем,
чтобы в результате добавления новости в БД она (БД)
не слишком увеличилась в размерах.
То есть я установлю лимит размера хранимых в БД новостей
допустим 5 мегабайт. И работать это будет так:
1 день - запускается add-news.php - берёт rss-новости
и добавляет их в БД.
2, 3, 4 дни и так далее тоже самое.
Одновременно надо следить: если размер всех
новостей (вычисляемый функцией strlen) превысит 5 мегабайт,
то нужно удалить ту новость которую скрипт добавил первой (в 1 день)
чтобы размер всех новостей уменьшился до "чуть чуть меньше 5 мегов".
Вот такая проблема. Заранее спасибо.
 

ВладимирЧе

Новичок
Автор оригинала: zerkms
а вопрос будет?
Мне надо чтобы происходило автоматическое удаление из БД MySQL
самой первой новости (которая добавлена в 1 день)
чтобы освободилось место для новости которая добавляется сегодня,
чтобы размер БД не превысил 5 мегабайт.
 

zerkms

TDD infected
Команда форума
и что именно ты не понимаешь, ты можешь сказать? ты не знаешь как организовать периодический запуск скрипта? или как удалить записи из БД за 1 день?
 

ВладимирЧе

Новичок
Автор оригинала: zerkms
и что именно ты не понимаешь, ты можешь сказать? ты не знаешь как организовать периодический запуск скрипта? или как удалить записи из БД за 1 день?
Как организовать периодический запуск скрипта я знаю (Читал "Linux - полное руководство, автор Денис Колисниченко).

"как удалить записи из БД за 1 день" - вот это не понимаю.
Подскажите плиз.
 

zerkms

TDD infected
Команда форума
в таких условиях - никак
почитай раздел о типах данных в mysql. найди те, которые относятся к хранению дат - выбери наиболее подходящий и смотри функции работы с ними...
 

dimagolov

Новичок
zerkms, а зачем дата? сделать автоинкрементное поле primary ключа и удалять записи с минимальным значением ключа. Чтобы это было совсем просто делать, надо с каждой новостью хранить ее размер.
 

zerkms

TDD infected
Команда форума
dimagolov
какая разница как делать :) у человека критерий "за один самый ранний день" - в соответствии с ним я и даю совет :)
 

ВладимирЧе

Новичок
Автор оригинала: dimagolov
zerkms, а зачем дата? сделать автоинкрементное поле primary ключа и удалять записи с минимальным значением ключа. Чтобы это было совсем просто делать, надо с каждой новостью хранить ее размер.
Думаю Ваш совет подходит мне. (Совет про date тоже подходит).
Надо сделать такой запрос:
select * from news ORDER BY id
выбираем все новости, сортируем по полю id, будет 1, 2, 3.
потом надо сделать запрос на удаление.
Вопрос: сначала удалим новости с id=1,2,
потом с id=3,4. Какой тогда нужен DELETE запрос?
Типа DELETE FROM news WHERE id=1,2,3. Но после этого
запрос на выборку первых новостей даст id=4,5,
значит надо уже DELETE FROM news WHERE id=4,5.
Как сделать универсальный DELETE?
Может быть совместить DELETE и SELECT? Как это сделать?

Но вот проблема надо удалять новость, чтобы размер всех
новостей уменьшился до "чуть-чуть меньше 5 мегов".
Перед добавлением новости надо посчитать: если размер всех новостей плюс
размер добавляемой новости будет больше 5 мегов, то удаляем
первые новости (которые были добавлены первыми) до тех пор
пока размер всех новостей не достигнет "чуть-чуть меньше 5 мегов"
и только тогда добавляем новость.
При этом при удалении новости надо ещё корректировать размер всех
новостей, ведь при удалении новости размер всех новостей уменьшится.
Допустим размер всех новостей + размер добавляемой новости больше 5 мегов,
значит удаляем первые новости до тех по пока размер всех
новостей не достигнет "вот только что было больше 5 мегов,
а после удаления стало меньше 5 мегов" и только тогда добавляем новость.
 

Фанат

oncle terrible
Команда форума
послушай.
размер одной новости - 2 килобайта. в мегабайт, значит, влежет 500. 5 мегбайт - 2,5 тыщи новостей.
Ты не думаешь, что к тому времени, когда на сайте наберется столько новостей, у него найдется места чуть побольше? или же он давно исчезнет к тому моменту?
 

ВладимирЧе

Новичок
Автор оригинала: *****
послушай.
размер одной новости - 2 килобайта. в мегабайт, значит, влежет 500. 5 мегбайт - 2,5 тыщи новостей.
Ты не думаешь, что к тому времени, когда на сайте наберется столько новостей, у него найдется места чуть побольше? или же он давно исчезнет к тому моменту?
Мой сайт не исчезнет. Мне интересно решить эту задачу.
Я буду брать rss-новости с нескольких сайтов, так что 2,5 тыщи новостей наберётся быстро.
 

Армян

Новичок
*****
+1, и сейчас даже самый дешевый хостинг редко предоставляет места меньше 1 гига
 

dimagolov

Новичок
ВладимирЧе, ты бы занялся чем-то более полезным именно сейчас. потому что 2.5 тыс новости (ну 10 в день) это почти год. К тому времени может много чего поменяться, а сейчас у тебя наверняка есть более актуальные задачи. Проще всего через пол года просто руками убить половину старых и забыть о проблеме еще через пол-года. это будет намного полезнее для всех (для сервера в первую очередь) чем твой select * from news ORDER BY id
 

ВладимирЧе

Новичок
Автор оригинала: dimagolov
ВладимирЧе, ты бы занялся чем-то более полезным именно сейчас. потому что 2.5 тыс новости (ну 10 в день) это почти год. К тому времени может много чего поменяться, а сейчас у тебя наверняка есть более актуальные задачи. Проще всего через пол года просто руками убить половину старых и забыть о проблеме еще через пол-года. это будет намного полезнее для всех (для сервера в первую очередь) чем твой select * from news ORDER BY id
Спасибо за совет, я понял свою ошибку. Представляю какая будет нагрузка
на БД MySQL при обработке этого запроса при двух тысячах записей. А запрос надо выполнять каждый день.

Но всё таки, я упрямый. Может подскажите мне как лучше сделать,
задача - то интересная :)
 

dimagolov

Новичок
я бы сделал несколькими запросами. в начале сделал count(*) и min(id), max(id). убедившись что max(id) - min(id) ~ count(*) посчитал бы в пхп LimitId MaxId + Count / 2 и сделал бы delete where id < LimitId

п.с. если делать по дням, то добавить в select MIN(date) и проcто delete ... where news_date = MinDate

п.п.с. два запроса надо, так как делать в одном select и delete к одной и той же таблице нельзя
 

ВладимирЧе

Новичок
Автор оригинала: dimagolov
я бы сделал несколькими запросами. в начале сделал count(*) и min(id), max(id). убедившись что max(id) - min(id) ~ count(*) посчитал бы в пхп LimitId MaxId + Count / 2 и сделал бы delete where id < LimitId
Что то я с формулой не понял.
Допустим
min(id)=5
max(id)=100
count(*)=95
max(id) - min(id) будет 95
только я не понял зачем здесь "max(id) - min(id) ~ count(*)" побитовый оператор "~"
 

dimagolov

Новичок
~ имелось в виду примерно равно. потому что что-то могло быть удалено из середины по каким-то причинам
 
Сверху