Созрел я, наконец, до реализации давней идеи. Суть в том, чтобы постинги топиков, к которым давно не было обращений, сбрасывать в отдельную таблицу. А при обращении к ним - перекидывать их снова в основную.
Решение оказалось даже несколько проще, чем я ожидал и серьёзно править в движке нужно только одно место одного файла
Сразу предупреждаю, что готового решения не даю, ибо расписывать до буковки многое просто лень, тем, у кого форумы на сотни тысяч постингов, скорее всего, моих подсказок будет достаточно, а для других это решение бесполезно.
Суть решения такая. Вводим учёт даты последнего чтения топика. Отдельным внешним скриптом скидываем то, к чему давно не было обращений в отдельную таблицу. В движке форума если при чтении из основной таблицы топики не были найдены, то пытаемся перебросить их из архивной в основную.
Итак, по порядку.
0. Делаем бэкап базы. На всякий пожарный.
1. Добавляем к таблице ib_topics новое поле `last_view_date` типа INT.
2. Делаем альтернативную таблицу в БД форума. Внимание, все префиксы у меня не ib_, а ib_! Так что меняйте сами!
CREATE TABLE `ib_posts_archive` ( `append_edit` tinyint(1) default '0', `edit_time` int(10) default NULL, `pid` int(10) NOT NULL auto_increment, `ubb_topic` varchar(11) default NULL, `ubb_post` int(11) default '0', `post` text NOT NULL, `author_id` mediumint(8) NOT NULL default '0', `author_name` varchar(32) default NULL, `use_sig` tinyint(1) NOT NULL default '0', `use_emo` tinyint(1) NOT NULL default '0', `ip_address` varchar(16) NOT NULL default '', `post_date` int(10) NOT NULL default '0', `icon_id` smallint(3) default NULL, `queued` tinyint(1) NOT NULL default '0', `topic_id` int(10) NOT NULL default '0', `post_title` varchar(255) default NULL, `new_topic` tinyint(1) default '0', `edit_name` varchar(255) default NULL, `
…
Дальше »»»