Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Простейший вопрос по оптимизации 
:(
    Опции темы
mus
Дата 2.9.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 22.5.2005

Репутация: нет
Всего: 1



Вопрос из ряда теоретических. В конце вопроса один практический подвопрос.

Перешел к изучение 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 свяжу таки эти модели и буду вот так подсчитывать кол-во сообщений, то на мой взгляд, выборка этих сообщений и занесение в массив не рационально с точки зрения используемой памяти. А если мы будем решать вопрос по первому пути, то есть с вложенным запросом, то тоже вроде нагрузка получается, ибо вложенный запрос нагрузка сам по себе.

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


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

Господа, какие Вы используете средства для тестирования скорости запроса к базе данных? Вот в моем примере мне нужно создать кучу записей, положим, с пол миллиона, чтобы поглядеть, какой запрос или способ исполняется дольше. Но ведь можно все это как-то имитировать? Может инструменты какие есть, а?..
PM MAIL   Вверх
Akina
Дата 2.9.2008, 21:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(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




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
mus
Дата 2.9.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 22.5.2005

Репутация: нет
Всего: 1



Akina, спасибо!

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

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

Был, вроде, такой инструмент...иль не был...
Полгода не программил вообще...
Буду иногда ошеломлять вопросами, извините заранее...
PM MAIL   Вверх
mus
Дата 2.9.2008, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 22.5.2005

Репутация: нет
Всего: 1



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.*) в перечислении филдов...
PM MAIL   Вверх
Deniz
Дата 3.9.2008, 07:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.