Страницы

Поиск по вопросам

воскресенье, 7 апреля 2019 г.

Оптимизация mysql запросов

Назрело несколько вопросов по оптимизации mysql запросов. К примеру, на главной странице форума выводятся последние 5 сообщений. Формат такой: форумная тема - короткий текст - ник - группа пользователя. До недавнего момента я бы писал что-то типа такого: /* таблица posts: id, user_id, theme_id, text таблица users: id, nick, group_id таблица themes: id, name таблица groups: id, name */ $posts = $db->execAndReturnAll('select `id`, `user_id`, `theme_id`, `text` from `posts` order by `id` desc limit 5');
$users = array(); $themes = array(); $groups = array();
$l = sizeof($posts); for($i = 0; $i < $l; ++$i) { if(!in_array($posts[$i]['user_id']), $users) $users[] = $posts[$i]['user_id']; if(!in_array($posts[$i]['theme_id']), $themes) $themes[] = $posts[$i]['theme_id']; }
$users = $db->execAndReturnAll('select `id`, `nick`, `group_id` from `users` where `id` in (0,'.implode(',', $users).')'); $themes = $db->execAndReturnAll('select `id`, `name` from `themes` where `id` in (0,'.implode(',', $themes).')');
$l = sizeof($users); for($i = 0; $i < $l; ++$i) { if(!in_array($users[$i]['group_id']), $groups) $groups[] = $users[$i]['group_id']; }
$groups = $db->execAndReturnAll('select `id`, `name` from `groups` where `id` in (0,'.implode(',', $groups).')'); Но меня что-то берут сомнения, а целесообразно ли посылать 4 простых запроса к БД или расходы на передачу запросов туда-обратно себя не окупят и лучше написать один сложный запрос? 2) Стоит ли перекладывать на mysql всевозможные расчеты или лучше оставить это php? То есть, что лучше: $data = $db->execAndReturn('select `width`, `height`, `width`*`height` as `square` from `rectangles` limit 1'); или $data = $db->execAndReturn('select `width`, `height`, from `rectangles` limit 1'); $data['square'] = $data['width'] * $data['height']; 3) Есть ли какие-либо инструменты для тестирования скорости запросов к БД? Заранее спасибо.


Ответ

В Вашем случае лучше написать один сложный. По поводу расчетов, mysql сделает их быстрее. Все таки php - это интерпритатор и любые лишние действия - это нагрузка. Но судя по Вашему коду, у Вас не нагруженный проект, так что такие действия (такие, как умножение) делайте там, где Вам удобнее :) Инструменты для тестирования: explain... и $start_time = microtime(true);
// выполнение действий
$exec_time = microtime(true) - $start_time;

Комментариев нет:

Отправить комментарий