Среднее кол-во запросов к базе у сайтов

221
06 января 2018, 03:51

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

На wp зашел к ним на сайт, у них на главной - 3 запроса, а в просмотре категорий - 5 запросов. Работает мгновенно...

Разрабатываю сейчас свой сайт, и смотрю что получается до 10ти запросов при каждом запросе на страницу, думаю, не многовато ли

Есть запрос у меня, который выводит весь основной контент, индексы - проставлены, но в нем есть несколько JOIN-ов и подзапросов, читаю - что такие запросы очень тяжело идут...

Вот пример запроса

SELECT  s.*,
    ( SELECT count(*) FROM `server_transitions` WHERE `server_id` = s.id ) AS `transitions`,
    FROM `servers` s
    LEFT JOIN `projects`    p       ON p.id     = s.project_id
    LEFT JOIN `games`       g       ON g.id     = p.game_id
    LEFT JOIN `vips`        vip     ON vip.id   = s.vip_id
    WHERE s.status = 1 AND p.game_id = $game_id
    ORDER BY s.position ASC
    LIMIT 0, 50
Answer 1

Смотря какой сайт. Бывает и по 20-30 обращений к БД на один запрос для сложных проектов (и это при хорошей оптимизации, когда информация в списках и прочих цикличных вещах вытаскивается одним запросом, а не несколькими десятками).

Другое вопрос в размере самой базы. Использовать запросы с JOIN'ами на больших таблицах не самый быстрый вариант. Лучше выполнять денормализацию данных или использовать сводные таблицы в таких случаях.

Запрос, который вы привели не оптимизирован. Советую сделать следующее:

  1. Не запрашивать данные сразу из 4 таблиц, а объединить все в одну
  2. Запросы с count(*) на MyISAM не самые быстрые. Лучше хранить данные счетчика в промежуточной таблице, а при операциях, связанные с его увеличением/уменьшением вносить соответствующие изменения в эту таблицу.
  3. Эта запись WHERE s.status = 1 AND p.game_id = $game_id во-первых, потенциально небезопасная. Оберните $game_id в кавычки. Во-вторых, для увеличения производительности лучше поменять местами условия поиска WHERE p.game_id = '$game_id' AND s.status = 1 (так мы сразу ищем строку по уникальному game_id, а не перебираем все варианты со status = 1, коих будет большинство).
  4. По поводу индексов - имейте ввиду, что при каждом конкретном запросе используется только ОДИН индекс (составной или простой). Желательно не ставить индексы на все подряд колонки, которые используются в WHERE или ORDER. Все равно толку от этого не будет, а UPDATE или INSERT будут занимать больше времени. Смотрите профиль нагрузки и явно задавайте индекс (INDEX) при сложных запросах.
  5. На часто запрашиваемых, но редко изменяемых данных помогает кэширование (Memcached).
READ ALSO
Поиск данных в кэше перебирая массив, или все-таки из базы?

Поиск данных в кэше перебирая массив, или все-таки из базы?

Есть у меня список товаров, я эти товары сериализовал и добавил в мемкеш, и при выводе вывожу из кэша

217
реализация рейтинга в yii2

реализация рейтинга в yii2

как реализовать в yii2 рейтинг, чтобы каждый пользователь мог поставить оценку от 1 до 5, меня интересует все от структуры до кода

244
Проверить, есть ли слово в строчке? [дубликат]

Проверить, есть ли слово в строчке? [дубликат]

На данный вопрос уже ответили:

192