Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Простейший вопрос по оптимизации


Автор: mus 2.9.2008, 20:46
Вопрос из ряда теоретических. В конце вопроса один практический подвопрос.

Перешел к изучение CakePHP, отсюда и структура всего действа.

Имеются две таблицы - topics и messages, связаны как один-ко-многим. В топиках - название темы, дата создания, в мессагах, соответственно, сами сообщения. Нужно построить запрос, который выведет следующее

topics.Название темы  |  topics.дата_создания  |  кол-во сообщений в теме (на ум приходит только вложенный запрос, типа (SELECT COUNT(*) messages WHERE topics.topics_id = messages.topics_id)

По идее - вложенные запросы создают напряги. Так как давно не программил в принципе, забыл, какая есть у вложенных запросов альтернатива. То ли левое и правое объединение, то ли ещё что...короче, запутался.

Теперь ситуация у CakePHP (mvc-фреймворк). Там есть такая мулька, позволяющая ассоциативно связать две модели. Я связал. При запросе $this->findAll(); мы получаем вот такой схематичный массив:


Код

Array
(
    [0] => Array
        (
            [Topic] => Array
                (
                    филды топика
                )

            [Message] => Array
                (
                    [0] => Array
                        (
                           филды месседжа
                        )

                    [1] => Array
                        (
                            филды второго месседжа
                        )
                )
        )
)



По идее, для того, чтобы вывести нужную мне строку вида (название темы | дата | кол-во сообщений), можно просто взять и при выводе массива на экран в поле кол-во сообщений вбить 
Код
count($a['Message']);
.


Работает и то и другое. Только вот в чем вопрос - представьте, что записей у меня в таблице - около миллиона. Если я с помощью CakePHP свяжу таки эти модели и буду вот так подсчитывать кол-во сообщений, то на мой взгляд, выборка этих сообщений и занесение в массив не рационально с точки зрения используемой памяти. А если мы будем решать вопрос по первому пути, то есть с вложенным запросом, то тоже вроде нагрузка получается, ибо вложенный запрос нагрузка сам по себе.

Вот и выбираю из двух зол, забыв, как можно избежать внутренний запрос.


А теперь вопрос вполне практический:

Господа, какие Вы используете средства для тестирования скорости запроса к базе данных? Вот в моем примере мне нужно создать кучу записей, положим, с пол миллиона, чтобы поглядеть, какой запрос или способ исполняется дольше. Но ведь можно все это как-то имитировать? Может инструменты какие есть, а?..

Автор: Akina 2.9.2008, 21:21
Цитата(mus @  2.9.2008,  21:46 Найти цитируемый пост)
на ум приходит только вложенный запрос

Хреново, если больше ничего не приходит...
Код

Select t.names, t.dates, count(m.*)
from topics t
inner join messages m
on t.topics_id = m.topics_id 
group by t.names, t.dates


Автор: mus 2.9.2008, 21:56
Akina, спасибо!

Я интуитивно понимал, что есть такое решение, но уже напрочь забыл синтаксис. Мне ещё многое предстоит вспомнить.

Есть какие рекомендации относительно тестирования скорости запросов с условием имитации их множества?.. Или имитации множества записей?..

Был, вроде, такой инструмент...иль не был...
Полгода не программил вообще...
Буду иногда ошеломлять вопросами, извините заранее...

Автор: mus 2.9.2008, 22:56
Akina, что-то, кстати, запрос Ваш не работает...
У меня MySQL 5.0.45-community-nt на localhost

Пишет

Код

#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 '*)
from lab_topics t
inner join lab_messages m
on t.id = m.lab_topics_id
gr' at line 1 
 

Ругается, что не понимает такой конструкции, как count(m.*) в перечислении филдов...

Автор: Deniz 3.9.2008, 07:04
Цитата(mus @  3.9.2008,  01:56 Найти цитируемый пост)
Ругается, что не понимает такой конструкции, как count(m.*) в перечислении филдов... 
вместо * поставь имя поля первичного ключа

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)