В MySQL простые запросы стали выполняться неоправданно долго?

Снала немного вводной информации.

Есть сайт с достаточно небольшой посещаемостью (1,5К уников в сутки), который хостится на VPS с 512 RAM + 1Ghz cpu. Есть база данных mysql с MyISAM таблицами. В среднем, в таблицах, учавствующих в запросах, около нескольких сотен тысяч записей, за исключением одной — там их почти миллион.

На полях таблиц, учавствующих в объединениях добавлены индексы типа BTREE + уникальные primary ключи.

Ведется mysql_slow log, в который записываются медленные запросы. Недавно заглянув в него, я с ужасом обнаружил, что достаточно простые запросы (без сортировки, группировки, поиска, лимитов, подзапросов) выполняются ОЧЕНЬ долго. Вот, к примеру такой запрос выполнялся почти 8 секунд:

SELECT `mp3_id3`.`artist`, `mp3_id3`.`album`, `mp3_id3`.`year`, `mp3_id3`.`title`, `mp3_genres`.`name` AS `genre`, `mp3_main`.`size`, `mp3_main`.`duration`<br/>
FROM (`mp3_id3`)<br/>
JOIN `mp3_main` ON (mp3_id3.song_id = mp3_main.song_id)<br/>
JOIN `mp3_genres` ON (mp3_id3.genre = mp3_genres.number)<br/>
WHERE `mp3_id3`.`song_id` = 52596131;



С чем может быть связано такое падение производительности? МБ стоит поменять какие нибудь параметры в конфиге mysql? Есть ли какие нибудь инструменты, которые могут помочь определить причину проблемы?
  • Вопрос задан
  • 8423 просмотра
Пригласить эксперта
Ответы на вопрос 7
rakot
@rakot
После миллиона записей MySQL начинает тупить со всем, что сложнее чем выборка по ключу. Действительно ли Вам тут нужен джойн? Я понимаю что он не сложный, но 3 селект запроса по ключу сработают быстрее чем джойн + гораздо больше шансов вытащить значения из кеша.

Еще у меня большое подозрения на блокировки, посмотрите в логах не ждут ли запросы большую часть времени права на лок таблицы.
Ответ написан
Комментировать
@niko83
проверь установлены ли индексы для столбцов.

Для анализа выполнения запроса есть EXPLAIN пишешь explain далее тело запроса. Читаешь мануал и анализируй результат функции
Ответ написан
blog.mysqltuner.com/ — попробуйте запустить этот скрипт, он поможет выявить некоторые узкие места

когда делаете джойны, проверьте чтобы на полях по которым делаются джойны были индексы
Ответ написан
Комментировать
AmdY
@AmdY
PHP и прочие вебштучки
уберите MyISAM, она на уровне таблиц, а не записи.
проведите денормализацию, например жанр можно хранить в таблице с песней или засунуть в SET
почему вы используете inner join а не left join для присоединения таблиц?

у вас явно создаётся temporary table, отсюда вся нагрузка. можете поэксперементировать с view.
Ответ написан
Комментировать
@pwlnw
>VPS
>падение производительности

Сопротивление бесполезно.
Но ты еще можешь пожаловаться хостеру.
Ответ написан
Комментировать
homm
@homm
В лог попадают одинаковые запросы?
Запросы из лога, выполненные с SQL_NO_CACHE позднее тоже дают результат в 8 секунд?

Я к тому, что может быть проблема не в запросах, а в том, что сервер тормозит по причине загруженности диска?
Ответ написан
Комментировать
Wott
@Wott
Наблюдайте за глабальными status параметрами и разбирайтесь что там не так. Есть скрипты, помогающие в этом — mysqlreport и tuning-primer.sh — легко гугляться.

Обычно замедляют MyISAM блокировки и temp disk tables, может быть мало места под индексы и прочее, могут быть лимиты по файловым дескрипторам.

Если не владеете темой — запустите упомянутые скрипты и внимательно разбирайтесь с тем что они скажут. Потом, если с памятью нет проблем, можно существенно увеличить возможные узкие места, если есть — ужать те что не используются… в общем это непростой итеративный процесс оптимизации :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы