Могу ли я использовать временные таблицы MySQL для хранения результатов поиска?

#php #mysql

#php #mysql

Вопрос:

У меня есть страница поиска, написанная на PHP, и она должна выполнять поиск в базе данных MySQL, а результат должен быть сортируемым. Эта страница поиска будет доступна многим пользователям (> 1000 в любое время).

Однако сортировать результаты поиска в MySQL невозможно, так как это будет очень медленно.

Я подумываю о сохранении каждого результата поиска во временной таблице (не во временной таблице MySQL), а имя таблицы хранится внутри другой таблицы для справки, например:

 | id | table_name | timeout |
-----------------------------
| 1  | result_1   | 10000   |
| 2  | result_2   | 10000   |
  

Тогда я могу использовать временные таблицы для сортировки любых результатов поиска, когда это необходимо, без необходимости реконструировать (с некоторыми изменениями) запрос.

Каждая таблица будет удалена в соответствии с указанным временем ожидания.

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

Спасибо

Комментарии:

1. если таблицы настроены правильно, сортировка с помощью mysql должна быть быстрее, чем практически любая альтернатива, это одна из тех вещей, для которых предназначена база данных.

2. Если вам нужны результаты ранжированной сортировки на основе частоты ключевых слов или чего-то подобного, используйте оператор SQL case для создания дополнительных столбцов сортировки. Редко бывает, что сохранение результатов запроса в новой таблице приведет к более быстрым запросам — скорее всего, дополнительные данные, которые вы вставляете, снизят производительность, имхо.

3. Я согласен с @Dagon. Почему было бы невозможно отсортировать результат в mysql? Системы баз данных предназначены для быстрой фильтрации и сортировки. Может ли это быть проблема с индексом или проблема с дизайном таблицы?

Ответ №1:

Нет необходимости беспокоиться о сохранении результатов в постоянной базе данных, если вы просто хотите кэшировать результаты поиска в памяти. Вам нужен индексированный доступ к реляционным данным? Если ответ отрицательный, не сохраняйте его в базе данных MySQL.

Я знаю, что phpbb (веб-форум с открытым исходным кодом, который поддерживает серверные части MySQL) использует хранилище ключей-значений для поддержки результатов поиска. Если форум настроен на предоставление вам ссылки на конкретную страницу результатов (с хэшем идентификатора поиска в строке запроса URL), то эта ссылка будет действительна некоторое время, но в конечном итоге будет удалена из кэша, как вы и хотите. Реализация полного уровня абстракции базы данных может быть излишней, если вы настроены на MySQL. В любом случае:

http://wiki.phpbb.com/Cache

Вы должны просто использовать memcached или что-то еще для хранения данных результатов, и вы можете легко получить данные и отсортировать их в PHP. Также существуют некоторые специфичные для PHP фреймворки кэша, которые минимизируют затраты на загрузку и выгрузку данных из интерпретатора:

https://en.wikipedia.org/wiki/List_of_PHP_accelerators