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

Статус
В этой теме нельзя размещать новые ответы.

verfaa

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

Slow Query Log - это быстрый способ найти наиболее тяжелые запросы, но при оптимизации производительности, анализ только Slow Query является слишком однобоким подходом. Включай general лог (если не продакшене, то не на долго) и анализируй сессию, возможно у тебя в пределах отображения одиночной страницы происходит много мелких и быстрых запросов, которые можно сжать в один. К примеру, я такое видел в старых версиях WP - к конфиг таблице было 2 десятка select запросов на каждую страницу сайта, хотя вся таблица занимала 10кб и можно было одним запросом выдернуть все значения и потом обращаться к массиву в памяти.
 
Где-то читал что для MyISAM таблиц 10-15 обычных SELECT запросов выполняются намного быстрее чем один большой запрос с кучей JOIN.
Так где правда? Как лучше писать? Один большой JOIN? Или разбивать на мелкие селекты без объединения таблиц (т.е. без JOIN)?
 
Где-то читал что для MyISAM таблиц 10-15 обычных SELECT запросов выполняются намного быстрее чем один большой запрос с кучей JOIN.
Так где правда? Как лучше писать? Один большой JOIN? Или разбивать на мелкие селекты без объединения таблиц (т.е. без JOIN)?

Надо еще учитывать время пока обёртки (db, pdo, mysqli) и скрипт обработают данные - замеряй из php или того языка, которым пользуешься.
Я предпочитаю запрос на 10 джойнов (с правильными индексами по полям) перед 10-м разных запросов на php
 
можно ещё исхитриться и запросы с большими джоинами, которые часто используются, скидывать в промежуточные таблички и с них выбирать, иногад такое, к сожалени, приходится делать

типичный пример
огромные таблички постов и метаданых к ним в вордпрессе, при наличии большого числа аттрибутов, даже повторющихся - результат (время) запросов, просто печальное
 
Сорри за возможно нубский вопрос)
Есть в таблице поля типа date и datetime. По ним очень часто выбираются данные за сегодня, за последнюю неделю, месяц, год и т.д.
Нужно ли ставить на такие поля индекс? Он будет работать так же как индекс для обычных полей?
И какой тип индекса для них ставить? Обычный "INDEX"?
 
Сорри за возможно нубский вопрос)
Есть в таблице поля типа date и datetime. По ним очень часто выбираются данные за сегодня, за последнюю неделю, месяц, год и т.д.
Нужно ли ставить на такие поля индекс? Он будет работать так же как индекс для обычных полей?
И какой тип индекса для них ставить? Обычный "INDEX"?
наверное хорошо бы почитать Для просмотра ссылки Войди или Зарегистрируйся
чтоб уже было понимание, что и как
 
Есть в таблице поля типа date и datetime. ..
И какой тип индекса для них ставить? Обычный "INDEX"?
По datetime можете смело ставить индекс только в случае отсутствия появления дублей, как впрочем, и в любом цифровом поле. Я всегда использую primary key
 
По datetime можете смело ставить индекс только в случае отсутствия появления дублей, как впрочем, и в любом цифровом поле. Я всегда использую primary key
Извините, но это бред.
Индексы расставляются на все поля, по которым идёт частая выборка данных или склейка (JOIN)

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