Как узнать, какие запросы грузят базу данных?

Тема в разделе "Базы данных", создана пользователем verfaa, 14 сен 2014.

Статус темы:
Закрыта.
Модераторы: latteo
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    374
    Симпатии:
    41
    Есть проект-самопис.
    За последние пару дней появляются периоды, когда сайт практически не грузится, а команда top показывает дикую нагрузку на mysql 90-130%
    Проект расположен на выделенном сервере, и пока имеет небольшую посещаемость в 1-1.5к уников в сутки. Но страниц очень много.
    Может можно как-то писать в log-файл запросы и их время выполнения, чтобы найти тяжелые запросы и исправить ситуацию. Или может есть другой выход?
     
  2. gres_18

    gres_18 Pythonобандерівець®

    Регистр.:
    26 апр 2009
    Сообщения:
    407
    Симпатии:
    206
    verfaa нравится это.
  3. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.523
    Симпатии:
    1.376
    Иногда легче для анализа и быстрее для настройки занести лог в таблицы - Перейти по ссылке
    Учти, что включение логирования увеличит нагрузку.

    Slow Query Log - это быстрый способ найти наиболее тяжелые запросы, но при оптимизации производительности, анализ только Slow Query является слишком однобоким подходом. Включай general лог (если не продакшене, то не на долго) и анализируй сессию, возможно у тебя в пределах отображения одиночной страницы происходит много мелких и быстрых запросов, которые можно сжать в один. К примеру, я такое видел в старых версиях WP - к конфиг таблице было 2 десятка select запросов на каждую страницу сайта, хотя вся таблица занимала 10кб и можно было одним запросом выдернуть все значения и потом обращаться к массиву в памяти.
     
    verfaa нравится это.
  4. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    374
    Симпатии:
    41
    Где-то читал что для MyISAM таблиц 10-15 обычных SELECT запросов выполняются намного быстрее чем один большой запрос с кучей JOIN.
    Так где правда? Как лучше писать? Один большой JOIN? Или разбивать на мелкие селекты без объединения таблиц (т.е. без JOIN)?
     
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.523
    Симпатии:
    1.376
    Надо еще учитывать время пока обёртки (db, pdo, mysqli) и скрипт обработают данные - замеряй из php или того языка, которым пользуешься.
    Я предпочитаю запрос на 10 джойнов (с правильными индексами по полям) перед 10-м разных запросов на php
     
    verfaa и Шумадан нравится это.
  6. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.728
    Симпатии:
    2.105
    можно ещё исхитриться и запросы с большими джоинами, которые часто используются, скидывать в промежуточные таблички и с них выбирать, иногад такое, к сожалени, приходится делать

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

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    374
    Симпатии:
    41
    Сорри за возможно нубский вопрос)
    Есть в таблице поля типа date и datetime. По ним очень часто выбираются данные за сегодня, за последнюю неделю, месяц, год и т.д.
    Нужно ли ставить на такие поля индекс? Он будет работать так же как индекс для обычных полей?
    И какой тип индекса для них ставить? Обычный "INDEX"?
     
    Шумадан нравится это.
  8. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.728
    Симпатии:
    2.105
    наверное хорошо бы почитать Перейти по ссылке
    чтоб уже было понимание, что и как
     
  9. Hannibal86

    Hannibal86 Создатель

    Регистр.:
    17 сен 2014
    Сообщения:
    37
    Симпатии:
    17
    По datetime можете смело ставить индекс только в случае отсутствия появления дублей, как впрочем, и в любом цифровом поле. Я всегда использую primary key
     
  10. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.523
    Симпатии:
    1.376
    Извините, но это бред.
    Индексы расставляются на все поля, по которым идёт частая выборка данных или склейка (JOIN)

    primary key ставится только на уникальные поля (или на одно поле), по которым однозначно можно идентифицировать необходимую строку таблицы.
     
Статус темы:
Закрыта.