Каков оптимальный номер запроса MYSQL в php-скрипте?

Я не профессиональный программист, поэтому я не могу быть уверен в этом. Как многие mysql запрашивают ваши сценарии на одной странице, и каков ваш оптимальный номер запроса. Например, на странице stackoverflow на странице перечислены вопросы, показывающие авторов этих вопросов. это stackoverflow отправляет запрос mysql foreach, чтобы получить информацию об авторе. или он отправляет 1 запрос и получает все пользовательские данные и сопоставляет его с вопросами?

Не сосредотачивайтесь на количестве запросов. Это не полезная метрика. Вместо этого вам нужно посмотреть на несколько других вещей:

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

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

  • сколько прогрессивной обработки вы делаете?

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

  • сколько вы можете кэшировать некоторые из этих данных? Даже кеширование в течение нескольких секунд может помочь очень.

Мне нравится держать шахту до 8 лет.

Серьезно, хотя это довольно бессмысленно. Если гипотетически, у вас было 800 запросов на странице, тогда вы могли бы пойти и сделать это. Вероятно, вы обнаружите, что количество запросов на странице будет просто зависеть от того, что вы делаете, хотя в обычных условиях я был бы удивлен, увидев более 50 (хотя в наши дни может быть трудно понять, сколько вы делаете, если вы абстрагируете свои звонки с БД).

Медленные запросы важны

Раньше меня разочаровывало в определенном PHP-форуме, на котором было 35 запросов на странице и выполнялось очень медленно, но это было давно, и теперь я знаю, что причина, по которой конкретная установка работает медленно, не имеет ничего общего с тем, что 35 запросов на странице. Например, только один или два из этих запросов занимали большую часть времени. У него просто было несколько действительно медленных запросов, которые были исправлены хорошо размещенными индексами.

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

У меня есть одна страница (которая на самом деле представляет собой тестовый пример / диагностический инструмент, предназначенный для запуска только администратором), который имеет более 800 запросов, но работает в считанные секунды. Я думаю, они все очень простые запросы.

Попробуйте кэшировать

Существуют различные способы кэширования частей вашего приложения, которые могут реально сократить количество запросов, не уменьшая функциональность. Библиотеки, подобные memcached, делают эти тривиально легкими в наши дни и все же работают очень быстро. Это также может помочь повысить производительность намного больше, чем уменьшить количество запросов.

Если запросы действительно не нужны, и производительность действительно имеет значение, то удалите / объедините их

Просто подумайте о том, чтобы искать медленные запросы и оптимизировать их, или сначала кэшировать их результаты.

На самом деле нет оптимального количества запросов. Очевидно, чем меньше запросов вы делаете, тем лучше.

Если вы используете какой-то ORM, такой как Hibernate, Propel, Doctrine и т. Д., Они будут генерировать запросы по-другому, чем если бы вы должны были писать SQL вручную. Поэтому, если StackOverflow использует ORM, у них может быть несколько запросов, обращающихся к вопросам и пользователям, создавшим вопросы. Или они могут просто использовать соединение с прямым SQL.

Это действительно зависит от используемой вами технологии и того, что она на самом деле делает за кулисами для создания SQL.

Вещи, которые вы должны исследовать, чтобы понять это лучше:

  • Ленивая загрузка
  • Реляционное сопоставление объектов

Недавно я начал реорганизацию старого кода, и я понял, что использовал множество запросов внутри циклов, потому что тогда я не знал, как писать SQL-запросы с подзапросами и объединениями и т. Д. Поэтому я пошел и интегрировал эти вложенные запросы в один запрос, чтобы я мог сразу получить все данные, а затем проложить через него вложенным образом.

В некоторых случаях это значительно ускоряло загрузку страницы.

Ergo: Конечно, стоит узнать о возможностях SQL, чтобы вы могли больше работать с SQL и меньше с PHP.

Я бы не сказал, что существует оптимальное количество запросов для любого сценария, но у вас есть цель при оптимизации; обычно, главное, главное беспокойство. Если время является единственной проблемой, вы можете оптимизировать свои запросы, чтобы у вас могли быть запросы, которые выполняются за меньшее время, чем другие запросы. Это то, как я рассматриваю оптимизацию, у меня есть цель, как я могу ее достичь. Есть ли какая-либо информация, которую вы можете кэшировать? Основываясь на ваших указателях, будет ли конкретный порядок фильтров в вашем запросе работать лучше …..

Моя точка зрения, оптимизация лучше всего делать как на конце Db, так и на конце приложения. Вы можете больше узнать о оптимизации базы данных.

Столько, сколько вам нужно, и не больше. Здесь нет эмпирического правила. Некоторые веб-сайты требуют большого доступа к db, а другие – нет.

У SO действительно есть только несколько вызовов db, если они написаны, как я думаю. На странице, подобной этой, ответ на вопрос, будет:

1) проверка сеанса, если вы вошли в систему. 2) текущая информация о пользователе, чтобы получить пользовательскую панель в верхней части экрана, а также счет вашей медали. 3) получить информацию о вопросе, а также информацию о допросе / последнем редакторе. 4) получить количество меток, используемых в этом вопросе. 5) выберите все ответы и данные ответчика за один снимок.

И это все. Самое интересное – это вопрос, который задал вопрос:

// this returns one row per revision select q.*, u.name, u.u_id, u.points, u.gmedal, u.smedals, u.bmedals from questions q left outer join users on q.u_id = u.u_id where q_id = :q_id; // this used to display the tags below the question and the tag counts on the right select t.name, count(*) from tags t left join tags q on q.tagid = t.tagid where t.q_id = :q_id // this can also get multiple revisions select a.*, u.name, u.u_id, u.points, u.gmedal, u.smedals, u.bmedals from answers a left outer join users on a.u_id = u.u_id where a.q_id = :q_id 

Это предполагает, что различные подсчеты (голосование, предпочтительный вопрос) кэшируются на столе, а также хранятся отдельно.

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

Когда я впервые установил WordPress, я был потрясен тем, что базовая установка выполнила более 20 запросов! Плагины увеличили бы это число (некоторые довольно много). Но с кешированием это можно свести к нулю (SuperCache). Если ваш контент меняется каждые 10 минут, зачем генерировать его динамически каждый раз?

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

Но, несмотря на это, я редко вижу необходимость использовать количество запросов двузначных цифр.

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