Я думал над этим. Оказалось довольно сложно.
В таблице большой объем данных. Добавляются новые записи каждые 20 минут. Получается, что каждые 20 минут нам нужно для каждой новой записи пробежать по всему массиву данных и понять — была уже такая новость или нет. Если была — берем ее ID и записываем «для этой новости есть еще и другой раздел».
Я правильно понял идею? Хранить только уникальные новости, а дублирование выносим в промежуточную таблицу. Проблема в ресурсоемком вычислении «дубликатов». Сравнение-то по url (строка переменной длины).
Тут вы ошибаетесь в нескольких моментах:
70 000 статей это не большой объем данных, это очень маленький объем данных. Большой это на 4-5 порядков больше.
Каждые 20 минут сделать SELECT `id` FROM `news` WHERE `url` = $url это менее затратная операция чем для каждого посетителя делать GROUP BY `url`
Строка переменнйо длины — если длина ограничена можно сделать поле varchar и по нему индекс и все будет нормально работать.
без GROUP BY данный запрос выполняется 0.7 сек
а по полю active индекс сделали?