Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Оптимизация запроса

Сообщения:  [1-9] 

 
 автор: Rustamich   (02.04.2009 в 02:05)   письмо автору
 
   для: Trianon   (29.03.2009 в 22:52)
 

Ясненько... Буду думать, может что и соображу... Спасибо за помощь!

  Ответить  
 
 автор: Trianon   (29.03.2009 в 22:52)   письмо автору
 
   для: Rustamich   (29.03.2009 в 19:05)
 

Без детального анализа сказать трудно. Более простые тоже разные бывают. Кроме того, многое зависит от наполнения исходных таблиц.

  Ответить  
 
 автор: Rustamich   (29.03.2009 в 19:05)   письмо автору
 
   для: Trianon   (26.03.2009 в 22:17)
 

Может вообще возможно заменить все запросы на более простые?

  Ответить  
 
 автор: Trianon   (26.03.2009 в 22:17)   письмо автору
 
   для: Rustamich   (26.03.2009 в 19:07)
 

на прямые запросы к соответствующим таблицам.

И последняя причина в том, что запросы эти Вы издаете в цикле. А значит - множество раз.

Уж коль скоро Вы создаете одну временную таблицу, почему не создать еще две-три?

  Ответить  
 
 автор: Rustamich   (26.03.2009 в 19:07)   письмо автору
 
   для: Trianon   (26.03.2009 в 15:33)
 

Спасибо что ответили! DISTINCT я использую чтобы выбрать с созданной таблицы количество контактов только определенной подрубрики. А на что это можно заменить?

  Ответить  
 
 автор: Trianon   (26.03.2009 в 15:33)   письмо автору
 
   для: Rustamich   (26.03.2009 в 15:06)
 

Очевидно, следует начать с того, что избавить первый запрос от константной составляющей,
вытащив данные о городе и регионе отдельным запросом, убрав их из построения таблицы и поменяв
  INNER JOIN towns ON cts.town_id = towns.town_id 
  INNER JOIN sitys AS st ON st.id = towns.st_id 
  WHERE towns.town_id='.$this->id_city_active.') 

на
  WHERE cts.town_id='.$this->id_city_active.') 


ну и вообще говоря, у Вас чуть ли не во всех запросах используется DISTINCT , что тоже гасит скорость.

  Ответить  
 
 автор: Rustamich   (26.03.2009 в 15:06)   письмо автору
 
   для: Rustamich   (25.03.2009 в 14:19)
 

Люди, срочно надо, пожалуйста помогите!!!

  Ответить  
 
 автор: Rustamich   (25.03.2009 в 20:49)   письмо автору
 
   для: Rustamich   (25.03.2009 в 14:19)
 

Неужели никто не может помочь???

  Ответить  
 
 автор: Rustamich   (25.03.2009 в 14:19)   письмо автору
 
 

Добрый день!

Есть база, с таблицами:
1. rubrics (rubric_id, name) - Рубрики
2. sub_rubics (sub_rubric_id, name, rubric_id) - Подрубрики
3. contacts_sub_rubrics (contact_sub_rubric_id, contact_id, sub_rubric_id) Одинаковые контакты, расположенные в разных рубриках и подрубриках
4. towns (town_id, name, st_id) - Города
5. states (state_id, name)[/b] - Страны
6. contacts (contact_id, name, town_id) - Ну и сами контакты

В общем вот, я, конечно, написал не все столбцы, только те которые нужны для запроса.

Есть запрос:
<?
$db
->query('CREATE TEMPORARY TABLE cnts (SELECT DISTINCT cts.contact_id, cts.town_id,  
  sr.sub_rubric_id, sr.name AS subrubric, rbs.rubric_id, rbs.name AS rubric, towns.name AS town, st.name AS country 

  FROM contacts AS cts 
  INNER JOIN contacts_sub_rubrics AS csr ON cts.contact_id = csr.contact_id 
  INNER JOIN sub_rubrics AS sr ON csr.sub_rubric_id = sr.sub_rubric_id 
  INNER JOIN rubrics AS rbs ON rbs.rubric_id = sr.rubric_id 
  INNER JOIN towns ON cts.town_id = towns.town_id 
  INNER JOIN sitys AS st ON st.id = towns.st_id 
  WHERE towns.town_id='
.$this->id_city_active.')
'
);
?>

После этого я работаю уже с этой таблицей, вытаскивая с нее список рубрик, подрубрик и количества контактов в каждой подрубрике в виде:

Рубрика_1
Подрубрика_1 (кол-во контактов)
Подрубрика_2 (кол-во контактов)
Рубрика_2
Подрубрика_3 (кол-во контактов)
Подрубрика_4 (кол-во контактов)
и т.д.


последовательными запросами:

<?
$db
->query('SELECT DISTINCT rubric_id, rubric FROM cnts ORDER BY rubric');
$db->query("SELECT DISTINCT sub_rubric_id, subrubric FROM cnts WHERE `rubric_id`='$rubric_id' ORDER BY subrubric");
$db->query("SELECT COUNT(*) as `count` FROM cnts WHERE `rubric_id`='$rubric_id' and `sub_rubric_id`='$sub_rubric_id'");
?> 

Делаю так, т.к нужно вытащить только те рубрики и подрубрики, которые есть в данном городе, т.е на самом деле рубрик и подрубрик в таблицах
rubrics и sub_rubrics много, но мне нужны только те, в которых есть контакты по данному городу.

Вопрос вот в чем: Как можно всё это упростить, т.к выполнение всех этих запросов занимает много времени.

Заранее благодарен за ответ!

P.S. Прилагаю код всей моей функции
<?
  
// Метод возвращает рубрикатор
  
function get_rubricator() {
    global 
$db;
    
$db->query('CREATE TEMPORARY TABLE cnts (SELECT DISTINCT cts.contact_id, cts.town_id,  
      sr.sub_rubric_id, sr.name AS subrubric, rbs.rubric_id, rbs.name AS rubric, towns.name AS town, st.name AS country 

      FROM contacts AS cts 
      INNER JOIN contacts_sub_rubrics AS csr ON cts.contact_id = csr.contact_id 
      INNER JOIN sub_rubrics AS sr ON csr.sub_rubric_id = sr.sub_rubric_id 
      INNER JOIN rubrics AS rbs ON rbs.rubric_id = sr.rubric_id 
      INNER JOIN towns ON cts.town_id = towns.town_id 
      INNER JOIN sitys AS st ON st.id = towns.st_id 
      WHERE towns.town_id='
.$this->id_city_active.')
    '
);
    
$q_rubrics $db->query('SELECT DISTINCT rubric_id, rubric FROM cnts ORDER BY rubric');
    if (
$db->num_rows($q_rubrics) > 0) {
      
$this->tpl_rubricator .= '<div id="rubric_list">';
      while (
$rub_rw $db->get_array($q_rubrics)){
        
$id_rubric $rub_rw["rubric_id"];
        
$name_rubric $rub_rw["rubric"];
        
$this->tpl_rubricator .= '<a href="javascript:void(0)"><img src="images/circle_right.gif"/>'.$name_rubric.'</a>'."\n";
        
$srQuery $db->query("SELECT DISTINCT sub_rubric_id, subrubric FROM cnts WHERE `rubric_id`='$id_rubric' ORDER BY subrubric");
        if (
$db->num_rows($srQuery) > 0) {
          
$this->tpl_rubricator .= '<div class="subrubric">';
          while (
$subrub_rw $db->get_array($srQuery)){
            
$id_subrubric $subrub_rw["sub_rubric_id"];
            
$name_subrubric $subrub_rw["subrubric"];
            
$CountQuery $db->query("SELECT COUNT(*) as `count` FROM cnts WHERE `rubric_id`='$id_rubric' and `sub_rubric_id`='$id_subrubric'");
            
$count_row $db->get_row($CountQuery);
            
$this->tpl_rubricator .= '<a href="?r='.$id_rubric.'&sr='.$id_subrubric.'">'.$name_subrubric.' ('.$count_row['count'].')'.'</a>'."\n";
          }
          
$this->tpl_rubricator .= '</div>';
        }
      }
      
$this->tpl_rubricator .= '</div>';
    }
    
$db->free();
    return 
$this->tpl_rubricator;
  }
?>

  Ответить  

Сообщения:  [1-9] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования