Лучше ли иметь PHP или MySQL делать тяжелую работу? - PullRequest
1 голос
/ 04 ноября 2011

Я потратил целую вечность на создание этой пользовательской функции поиска для моего сайта в PHP, где он постепенно строит запрос MySQL на основе того, какие опции и входные данные предоставляет конечный пользователь.Он отлично работает на моем локальном сервере, но когда я загрузил его на рабочий сайт, он работает СУПЕР медленно.Я относительно новичок в программировании на PHP и MySQL, и поэтому мне любопытно в целом и для будущих проектов:

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

Ответы [ 4 ]

2 голосов
/ 04 ноября 2011

Это балансирование. Вот мои предложения:

  • Используйте FULLTEXT , чтобы ускорить поиск строк.
  • Порядок полей в предложениях WHERE, чтобы сначала индексировать столбцы, затем цифры, затем даты, а затем текстовые поля. Это уменьшит вашу нагрузку, отфильтровывая дорогие столбцы после дешевых, уменьшая объем работы, которую должна выполнять база данных.
  • Избегайте ORDER при работе с большими наборами данных и перенесите эту обработку в свой PHP-код, поскольку это избавит MySQL от упорядочения данных в каждой точке запроса.
  • Индексировать наиболее часто используемые или дорогие для поиска поля.
  • Не используйте большое количество JOIN, когда вы можете легко выполнить два или более запросов. Запрос с 10 или 20 JOIN для некоторых больших таблиц может полностью уничтожить вашу базу данных.
  • UNION полезен для одновременного выполнения нескольких запросов SELECT к одной и той же таблице вместо сложной логики с OR.

Как правило, оптимальных запросов должно быть достаточно. В некоторых случаях выполнение работы на PHP полезно, но база данных должна быть достаточно быстрой для 99% случаев.

1 голос
/ 04 ноября 2011

если к базе данных обращаются многие веб-серверы, вероятно, будет не очень хорошая идея сделать на сервере MySQL много работы. во-вторых, если вы используете запрос, который выдает большой объем данных, он будет долго переносить ваши данные на веб-сервер, и вам придется выполнять намного больше обработки в php.

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

так что все зависит от того, что вы делаете

0 голосов
/ 04 ноября 2011

Есть несколько переменных, которые вступают в игру при оптимизации веб-приложения. Исходя из того, что вы заявили, предоставление пользователю возможности выбрать несколько опций для «построения запроса» приводит меня к мысли, что вы, возможно, выполняете некоторые операции MySQL, которые являются дорогостоящими. Вы хотите держаться подальше от OR, и если вам нужно сделать какой-либо ORDER BY, вы можете сделать это на прикладном уровне, просто заполнив массив результатов, затем отсортировав массив.

Вы также можете рассмотреть возможность добавления слоя кэша, который расположен над слоем MySQL, чтобы вам не приходилось каждый раз обращаться к базе данных.

Как упомянул Керрек в своем комментарии, вы можете профилировать свое приложение, чтобы увидеть, где находятся узкие места, посмотрите XDebug (http://xdebug.org/) и KCacheGrind (http://kcachegrind.sourceforge.net/html/Home.html)

)

Несколько идей, с чего можно начать.

0 голосов
/ 04 ноября 2011

Я думаю, вы можете комбинировать это для достижения наилучших результатов. Прежде всего, запустите запрос на основе точных совпадений или действительно близких совпадений. По сути, если кто-то ищет точное имя страницы, вы просто хотите вернуть его (= вместо LIKE). Тогда, может быть, если они правильно поняли первую часть (как «слова%»). Затем, наконец, создайте более сложную версию, в которой MySQL будет выполнять тяжелую работу. Это обеспечивает самый быстрый возврат, когда пользователь предоставляет лучшие данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...