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

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

db file test

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

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

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

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

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

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

Шаг 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 может оптимизировать выполнение запроса. В данном случае быстро были выполнены те запросы, результаты которых входили в предыдущие.

  • а при тестах в настройках mysql кеш(в смысле родной) был включён или нет?

    • Да, если «говорить» конкретно:

      have_query_cache YES
      query_cache_limit 1048576
      query_cache_min_res_unit 4096
      query_cache_size 8388608
      query_cache_type ON
      query_cache_wlock_invalidate OFF

      Версия MySQL 5.0.45

  • а при тестах в настройках mysql кеш(в смысле родной) был включён или нет?

    • Да, если «говорить» конкретно:

      have_query_cache YES
      query_cache_limit 1048576
      query_cache_min_res_unit 4096
      query_cache_size 8388608
      query_cache_type ON
      query_cache_wlock_invalidate OFF

      Версия MySQL 5.0.45

  • эйсид

    Зашел на сайт нечаянно! И рад! Классно пишите! Спс!
    ____________________
    http://zarevo.org/

  • эйсид

    Зашел на сайт нечаянно! И рад! Классно пишите! Спс!
    ____________________
    http://zarevo.org/

  • Preacher

    Таблица то без индексов была?

    • Я пробовал и так, и так. В данном случае индексы роли практически не играли, т.к. данные были случайные и не повторялись.

  • Preacher

    Таблица то без индексов была?

    • Я пробовал и так, и так. В данном случае индексы роли практически не играли, т.к. данные были случайные и не повторялись.

  • Flor_Master

    Пасибо! довольно позновательно, сам столкнулся с таким вопросом.

  • Flor_Master

    Пасибо! довольно позновательно, сам столкнулся с таким вопросом.