Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » MySQL запрос

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Goodizer

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте!
Имеется 2 таблицы(InnoDB):
"topics" - наполненый 200 тысяч тем
      2 колонки - "id" и "topic"
"answers" - наполненый 800 тыс. ответов
      3 колонки - "id", "answer" и "topic_id"
Делаю запрос:
 

Код:
 
$query = mysql_query("SELECT * FROM topics LIMIT 0, 30"); // вывожу первые 30 тем
if(!$query)
{
exit('Error!');
}
else
{
   while($res = mysql_fetch_array($query))
   {
   $themes[] = $res['topic'];
   $query2 = mysq_query("SELECT COUNT(id) AS cnt FROM answers WHERE topic_id = $res['id']");
   $res2 = mysql_fetch_array($query2);
   $answers[] = $res2;
   }
}
 

темы выводит быстро т. к. их всего 30, но вывод количества ответов(каждой темы) занимает более 3 секунд только на одну тему, а их 30.
Помогите оптимизировать запрос! Очень прошу!

Всего записей: 12 | Зарегистр. 06-07-2013 | Отправлено: 17:37 06-10-2013
esche

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
SHOW CREATE TABLE answers  
покажите.
Скорее всего индекса на topic_id нет.
 
Можно обойтись одним запросом для полсчёта количества ответов, результат разобрать в PHP
в :topics ID-шники топиков через запятую  1,2,3

Код:
mysq_query("SELECT topic_id,COUNT(id) AS cnt FROM answers WHERE topic_id IN (:topics) GROUP BY topic_id");  

Всего записей: 49 | Зарегистр. 03-05-2013 | Отправлено: 17:56 06-10-2013
Goodizer

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задам вопрос по другому.
Как мне в одном запросе вывести из таблицы "topics" 30 тем, но чтобы к каждой теме выводилось количество ответов из таблицы "answers"?
 
дамп таблицы "topics":
id   |   topic
1        Тема 1
2        Тема 2
3        Тема 3
4        Тема 4
5        Тема 5
...       ...
 
дамп таблицы "answers":
id     |   answer   |   topic_id
1         Ответ 1       4
2         Ответ 2       1
3         Ответ 3       4
4         Ответ 4       2
5         Ответ 5       5
...        ...              ...
 
В данном случае должно выводится 5 тем:
Назв. темы | Количество ответов
 
Тема 1       -             (1)
Тема 2       -             (1)
Тема 3       -             (0)
Тема 4       -             (2)
Тема 5       -             (1)

Всего записей: 12 | Зарегистр. 06-07-2013 | Отправлено: 19:57 06-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Goodizer
есть же тема!
MySQL Помогите составить запрос

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:45 06-10-2013
esche

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Задам вопрос по другому.  
 

Зачем задавать вопрос "по-другому", если Вы не "слушаете" ответы? Индекс на столбец добавьте. Быстрее будет. Если индекс уже есть - тюнить MySQL (индексы в память могут не помещаться) или переезжать на более мощное железо... Запрос по ключу 3 секунды для 800к - это много.
 

Цитата:
Как мне в одном запросе вывести из таблицы "topics" 30 тем, но чтобы к каждой теме выводилось количество ответов из таблицы "answers"?  
 

Вам надо в 1 запросе? Или чтоб быстрее работало?
Для второго варианта лучше 2 (не 31) запроса делать.
 
В случае с 1 запросом будет перемножение таблиц 800к*200к - выигрыш в скорости не получится.
 
p.s. С дальнейшим обсуждением всё же лучше переместиться в указанный топик

Всего записей: 49 | Зарегистр. 03-05-2013 | Отправлено: 21:43 06-10-2013
Goodizer

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
не могу я найти в указаном топике то что мне нужно
Вот у Вас на форуме страница http://forum.ru-board.com/forum.cgi?forum=31 грузится за 1 сек, при этом показывает количество ответов к каждой теме(не спорю железо у Вас мощнее), а у меня на такой запрос уходит более 1 мин так что железо тут не причем.
Что мне здесь исправить?!?!??!:
 

Код:
 
$q = "SELECT * FROM topics ORDER BY id ASC LIMIT ".$start.", 30";
$resultGetTopic = mysql_query($q);
if(!$resultGetTopic)
{
return exit('Ошибка подключения к БД!');
}
else
{
   while($getTopic = mysql_fetch_array($resultGetTopic))
   {
   $q1 = "SELECT COUNT(id) AS cnt FROM answers WHERE topic_id = ".$getTopic['id']." GROUP BY topic_id";
   $resultCnt = mysql_query($q1);
      if(!$resultCnt)
      {
      return exit('Ошибка подсчета ид!');
      }
      else
      {
      $cnt = mysql_fetch_assoc($resultCnt);
      }
   echo $getTopic['topic'].' | Ответов: '.$cnt['cnt'].'<br />';
   }
}
 

И можете немножко прояснить как мне сделать индексацию с таблицами приведенные выше?

Всего записей: 12 | Зарегистр. 06-07-2013 | Отправлено: 18:27 07-10-2013 | Исправлено: Goodizer, 19:40 07-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Goodizer

Код:
SELECT t.*, count(a.id) FROM answers a
RIGHT JOIN (SELECT * FROM topics LIMIT 30) t ON t.id = a.topic_id
GROUP BY a.topic_id

 

Цитата:
И можете немножко прояснить как мне сделать индексацию с таблицами приведенные выше?

идете в phpmyadmin или иное средство и выставляете индексацию на столбцы по которым делается поиск

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:47 07-10-2013 | Исправлено: Cheery, 20:47 07-10-2013
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » MySQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru