История одного мини теста или почему не стоит изобретать велосипед

Владимир | | MySQL, PHP, Web разработка.

О том, что кэширование может значительно увеличить скорость работы сайта, знают все. Но в некоторых случаях создание кэша – не самый лучший вариант.

Например, есть скрипт интернет-магазина и таблица в базе данных с описаниями товаров и их ценами. Посетитель видит форму с помощью, которой можно найти все товары, которые попадают в заданный диапазон цен.

Ясно, что создавать кэш для каждого сочетания цен будет неэффективно. Количество таких сочетаний измеряется десятками или сотнями тысяч.

Выполнить поиск в базе – не проблема. Но меня заинтересовал другой вопрос. Не будет ли быстрее искать данные в текстовом файле, а не базе?

В интернете готовых результатов тестирования я не нашел (наверное, искал плохо 😉 ). Поэтому решил написать собственный мини тест.

Порядок тестирования был следующий.

Шаг 1. Создал базу данных с таблицей для хранения данных. Таблица имела 3 поля:
id – PK;
description – описание товара;
price – цена.

Шаг 2. Написал небольшой скрипт, который заполнял таблицу случайными значениями. Всего было создано 10000 записей. Поле description имело длину 450 символов, которые выбирались случайным образом из заранее заданного набора, а значения в поле price изменялись в диапазоне от 0 до 5000.

Шаг 3. Написал еще один php скрипт, который создавал текстовый файл с данными из таблицы. Для сохранения данных использовал функцию serialize(). Размер файла получился чуть больше 5 МБ.

Шаг 4. Написал скрипт теста. Принцип работы был такой:
1) задавался диапазон цен;
2) выполнялся поиск в базе данных (использовал библиотеку AdoDB, судя по результатам тестов работает довольно быстро);
3) выполнялся поиск в текстовом файле (стандартные функции PHP);
4) измерялось время выполнения второго и третьего пунктов.

Тест запускался 20 раз. В результате получилось, что поиск в файле выполняется быстрее на 0,03 с.
Среднее время поиска для базы – 0,239 с, для файла – 0,205 с.

На графике можно посмотреть результаты отдельных тестов. По вертикальной оси отложено время поиска (в секундах), по горизонтальной – номер теста.

database file

Шаг 5. Смотрю я на этот график… Как говориться: «no comments». Поиск в файле выполняется немного быстрее чем в базе, но ведь на сколько усложняется приложение. Каждую операцию записи в эту таблицу базы придется повторить для файла.

Спрашивается, зачем было искать обходные пути?

Нужно будет повесить себе на стену плакат: «Не изобретай велосипеды». Или заставку на рабочий стол сделать 🙂 .

До встречи!

P.S. Вы, наверное, заметили, что на графике время поиска в базе сильно изменяется. Это связано с тем, что в некоторых ситуациях MySQL может оптимизировать выполнение запроса. В данном случае быстро были выполнены те запросы, результаты которых входили в предыдущие.