Оптимизация MySQL запроса.

Печать RSS
665

Автор
Чатланин
0
Доброго времени суток. Пишу форум.

Цель: Вывести список фракций, с последующими колонками, Название | Кол-во тем | Кол-во сообщений | Посл. тема, Автор, Время.

Составил MySQL запрос. Все работает. Но нельзя ли его как то оптимизировать?

Сам запрос.

SELECT a.`id`, a.`name`,
( SELECT COUNT(*) FROM `forum_fthemes` WHERE `fid` = a.`id` ) AS `count_themes`,
( SELECT COUNT(*) FROM `forum_fmessages` WHERE `fid` = a.`id` ) AS `count_messages`,
( SELECT `last_author` FROM `forum_fthemes` WHERE `fid` = a.`id` ORDER BY `last_time` DESC LIMIT 1 ) AS `last_author`,
( SELECT `last_time` FROM `forum_fthemes` WHERE `fid` = a.`id` ORDER BY `last_time` DESC LIMIT 1 ) AS `last_time`,
( SELECT `title` FROM `forum_fthemes` WHERE `fid` = a.`id` ORDER BY `last_time` DESC LIMIT 1 ) AS `last_title`,
( SELECT `name` FROM `players` WHERE `id` = `last_author` LIMIT 1 ) AS `name_author`
FROM `fractions` AS a
Изменил: Александр (23.05.2013 / 21:41)
J

Оранжевые штаны
0
так не пробовал? я сам х3, не проверял
SELECT a.`id`, a.`name`
(SELECT b.`last_author` AS `last_author`, b.`last_time` AS `last_time`, b.`title` AS `title`, COUNT(b.*) AS `count_themes`  FROM b WHERE b.`fid` = a.`id` ORDER BY b.`last_time` DESC LIMIT 1), 
(SELECT COUNT(*) FROM c WHERE c.`fid` = a.`id`) AS `count_messages`, 
(SELECT d.`name` FROM d WHERE d.`id` = `last_author` LIMIT 1) AS `name_author` 
FROM fractions AS a, forum_fthemes AS b, forum_fmessages AS c, players AS d
Автор
Чатланин
0
Ошибку выдает.

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT b.`last_author` AS `last_author`, b.`last_time` AS `last_time`, b.`title`' at line 2
Изменил: Александр (24.05.2013 / 00:29)

Пацак
0
В место звездочек в COUNT(*) поставьте значение какого нибуть одного поля например, примака. После измерьте скорость выполнения запроса, прирост очевиден. Используйте в запросах LIMIT. Если не надо много одинаковых значений - сгруппируйте их. Еще лучше пометьте UNIQUE непосредственно в теле таблицы. Выводите в SELECT не звездочкой, а только имена нужных Вам полей перечисленных через запятую, Используйте хранимый код он быстрее выполняется. SQL на самом деле на много фукциональнее и богаче чем Вы можете себе это вообразить, молодой человек. Посему, советую изучить его глубже, воспользуйтесь специализированной литературой для этого.
Удачи в разработке. Всех Вам благ

Веем холодом
0
erika (26 Мая 2013 / 06:52)
В место звездочек в COUNT(*) поставьте значение какого нибуть одного поля например, примака. После измерьте скорость выполнения запроса, прирост очевиден. Используйте в запросах LIMIT. Если не надо много одинаковых значений - сгруппируйте их. Еще лучше пометьте UNIQUE непосредственно в теле таблицы. Выводите в SELECT не звездочкой, а только имена нужных Вам полей перечисленных через запятую, Используйте хранимый код он быстрее выполняется. SQL на самом деле на много фукциональнее и богаче чем Вы можете себе это вообразить, молодой человек. Посему, советую изучить его глубже, воспользуйтесь специализированной литературой для этого.
Удачи в разработке. Всех Вам благ
А готовое написать?smile
В

Пришелец
0
4. erika
"место звездочек в COUNT(*) поставьте значение какого нибуть одного поля например, примака" - прирост не очевиден, тем более если выборка по индексу.
- - -
"Используйте в запросах LIMIT" - прии спользовании индексов (а обычно 100% использования всеми) не эффективно.
дальше и читать не стал.. где такой ерунды набрались?

Пацак
0
6. Trionix, видимо Вы не дружите с книгами, не в курсе, что на каждый запрос выделяется определенный лимит времени и памяти. А запросы со звездочками автоматически регистрируются системой в журнале ламмерских запросов сервера БД. Это, как звонок пожарной сигнализации на который, опытный и аккуратный программист не может не обратить пристального внимания во избежание катастроф связанных с возможными нагрузками (например ддос), в виду своего личного профессионилизма.
Давайте. Создайте еще один на обе ноги кривой дцмс (ранних версий). Вас же будут тыкать носом, с Вас же будут скромно улыбатся в усы, тихонько перешептываясь знающие люди, профессионалы. По этому мне, как соловью - извращайтесь.
PS.
Но если же Вы вдруг произошли из славного рода Страшилы Мудрого, пардон - ищите Элли. На совместных теннингах со всей ее гоп компанией, стопуя незадачливых туристов по пути к Гудвину Вы волей - не волей научитесь немного и изредка, чуток пошевеливать своими соломенными извилинами)

Добавлено через 06:36 сек.
5. Zдешний, о чем Вы?
Человек спросил совет по оптимизации горбатого кода - я его дала. Возможно в этой отрасли институтов я не заканчивала, но книг на своем веку прочла не мало. По этому его по праву можно назвать авторитетным.
Возможно Вас интересуют какие нибуть конкретные моменты. Тогда будьте добры - уточните.
В

Пришелец
0
7. erika, читать умею. например вот: http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/, а то мне ведь не верите. все же, где можно почитать вашу ерунду?

Пацак
0
8. Trionix, возьмите любую книгу по администрированию СУРБД. И прочтите то что на первый взгляд Вам покажется самым не интересным.
По поводу статьи по ссылке. Взглянув на примеры кодов - читать не стала.
PS.
И еще одно, позвольте узнать, почему это личное мнение какого то мистера Зайцева я должна ставить выше вот этой кгиги ?
Изменил: Erika (26.05.2013 / 12:47)
В

Пришелец
0
9. erika, About Peter Zaitsev

Peter managed the High Performance Group within MySQL until 2006, when he founded Percona. Peter has a Master's Degree in Computer Science and is an expert in database kernels, computer hardware, and application scaling.
- - -
иметь книгу на полке, знать ее содержание, уметь применять знания из книги - 3 разных вещи. спс за ссылку. еще бы страницу в книге, где говорится о вашем мнении.
Стикеры / Теги / Правила / Топ тем / Топ постов / Поиск