Недавно пришлось оптимизировать доску объявлений, с разделами, и подразделами. Что из это получилось, можно посмотреть тут
http://vse.doski.ws/.
Обычное трехуровневое дерево, которое хранится в файле наподобие CSV.
Разделителем полей является |, разделителем строк #13#10..
Что мне не понравилось - чтобы найти категорию по "ID" и/или "Значению", нужно пройДтись по всем строкам,
каждой сделать explode ('|',$row), и сравнить искомый элемент (ID и/или "Значение") с результатом explode.
Не долго думая, я перевел все все дерево в трехуровневый массив,
и сохранил в другой файл, предварительно сделав serialize.
Трехуровневый массив позволял делать поиск и проверку элементов дерева
по индексу isset($tree[$ID]) ,и по значению - in_array(...).
Чтобы загрузить весь массив нужна одна строка кода
$tree = unserialize(implode('',file('tree_new.dat')));
Никаких while, foreach, for, c переборам по строкам, при таком методе не нужно.
Конечно, serialize/unserialize достаточно тяжелые функции, но они выполняются всего 1 раз,
в отличии от explode для каждой строки.
Чтобы разобраться, я написал тестер.
У меня было 350 категорий, и занимал обычный файл 8,2 КБ, после serialize - 24.1КБ
и получаю вот такие результаты :
Делаю 5 итераций по 8 раз.
Тестирование file(), explode().
cid = 9110, cidname=Услуги Разные, ncid=, katname=Фото, видео, аудио; Средний рез. 0.0101898193359
Тестирование unserialize, serialize.
cid = 9110, cidname=Услуги Разные, ncid=, katname=Фото, видео, аудио; Средний рез. 0.0376589775085
метод с serialize медленней, оказывается медленней в 3 раза!!!
Вопрос почему?
Думаю что не смотря на все свои обороты, кеши, и т.д, жесткий диск - самое медленное устройство.
Т.к. при serialize, размер файла возрастает в ~3 раза, то и скорость загрузки тоже.
Что прямолинейно отражает тест.
Выводы.
Старайтесь как можно больше убирать избыточность данных, в файлах, и базах mysql.
Большее внимание уделять структуре хранения данных на этапе проектирования приложения.