SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 16.02.2012 17:30:44

dapon
Участник
Зарегистрирован: 16.02.2012
Сообщений: 2

Оптимизация запросов в цикле ?!

Собственно код


    {
        $ds =(mktime(0,0,0, date("n"), date("j"), date("Y")));
        $de = (mktime(0,0,0, date("n"), date("j"), date("Y"))+86400);

        global $database, $main;
        $res = $database->query("SELECT * FROM info
                          WHERE s_id = "
.$site_id." AND
                                m_id "
.(is_array($m_id)?"IN ".implode($m_id,","):"=".$m_id)." $ext
                          "
.$this->order."
                          LIMIT "
.(($page-1)*$onpage).", $onpage");
        if(mysql_num_rows($res))
        {
            $this->fnd = mysql_num_rows($res);
            $cnt = $database->query("SELECT count(*) as cnt FROM info
                          WHERE s_id = "
.$site_id." AND
                                m_id = $m_id $ext"
);
            $rcnt = mysql_fetch_array($cnt);
            $this->total = $rcnt['cnt'];
           
            $id_list = '';

            while($row = mysql_fetch_array($res))
            {
                $this->info[$row['info_id']] = $row;
                $sid = $row['info_id'];
                $result=$database->query("SELECT count(id) FROM wc_big_main WHERE time >= ".$ds." AND time < ".$de." AND site_id = $sid" );
                list($host_today)=mysql_fetch_array($result);
                $result=$database->query("SELECT count(id) FROM wc_big_main WHERE site_id = $sid" );
                list($host_all)=mysql_fetch_array($result);
               
                $result=$database->query("SELECT count(id) FROM wc_big_session WHERE  time >= ".$ds." AND time < ".$de." AND statid IN (SELECT id FROM wc_big_main WHERE site_id = $sid)" );
                list($hit_today)=mysql_fetch_array($result);
                $result=$database->query("SELECT count(id) FROM wc_big_session WHERE statid IN (SELECT id FROM wc_big_main WHERE site_id = $sid)" );
                list($hit_all)=mysql_fetch_array($result);
                $this->info[$row['info_id']]['host_today'] = $host_today;
                $this->info[$row['info_id']]['host_all'] = $host_all;
                $this->info[$row['info_id']]['hit_today'] = $hit_today;
                $this->info[$row['info_id']]['hit_all'] = $hit_all;
                $this->info[$row['info_id']]['info_date_end_mk']=$this->info[$row['info_id']]['info_date_end'];
                $this->info[$row['info_id']]['info_date_start_mk']=$this->info[$row['info_id']]['info_date_start'];
                $this->info[$row['info_id']]['title'] = iconv("CP1251","UTF-8",$this->info[$row['info_id']]['title']);
                $this->info[$row['info_id']]['content'] = iconv("CP1251","UTF-8",$this->info[$row['info_id']]['content']);
                $this->info[$row['info_id']]['info_date_end']=mktime2date($row['info_date_end']);
                $this->info[$row['info_id']]['info_date_start']=mktime2date($row['info_date_start']);
                $this->info[$row['info_id']]['info_date2']=mktime2date($row['info_date']);
                $this->info[$row['info_id']]['cat_id'] = $this->info[$row['info_id']]['c_id'];
                $id_list.= $row['info_id'].",";
            }


С MySQL опыта вообще мало. т.е простые запросы понимаю как делать ,а что дальше это для меня дебри, вообщем ребята помогите.Судя по названиям таблиц мне логика подсказывает что можно как то объединить запросы.но как не понимаю.
Селект запросы в цикле + есть и вложенные, очень долго тянут ,а то и вообще не выводят информацию на сайт, кто решение подскажет правильное?Спасибо.

Отредактированно dapon (16.02.2012 17:36:08)

Неактивен

 

#2 16.02.2012 18:38:08

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Оптимизация запросов в цикле ?!

В общем если количество записей небольшое (10-20) то делать отдельные запросы это не критично.
Важно чтоб сами запросы работали быстро.
  1) Обязательно должны быть нужные индексы.
  2) Неплохо избавится от тормозящего WHERE IN
     Конструкцию
     

SELECT count(id) FROM wc_big_session WHERE statid IN (SELECT id FROM wc_big_main WHERE site_id = $sid)

     заменить на
     
SELECT count(s.id) FROM wc_big_session s JOIN wc_big_main m ON (s.statid=m.id)  WHERE m.site_id = $sid;

  3) Сэкономить на количестве обращений можно так

SELECT
(SELECT count(id) FROM wc_big_main WHERE time >= ".$ds." AND time < ".$de." AND site_id = $sid") 'host_today',
(SELECT count(id) FROM wc_big_main WHERE site_id = $sid"
) 'host_all'

Отредактированно evgeny (16.02.2012 18:39:53)

Неактивен

 

#3 16.02.2012 18:45:25

dapon
Участник
Зарегистрирован: 16.02.2012
Сообщений: 2

Re: Оптимизация запросов в цикле ?!

Спасибо.в том то и дело в этих таблицах записей очень много, порядка 200000.
а 3) он выполнится как один запрос или 3 подзапроса?

Неактивен

 

#4 16.02.2012 20:05:42

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Оптимизация запросов в цикле ?!

dapon написал:

Спасибо.в том то и дело в этих таблицах записей очень много, порядка 200000.
а 3) он выполнится как один запрос или 3 подзапроса?

Один запрос с тремя под запросами. Это сэкономит количество обращений с самого PHP, соответственно будет немного быстрее.
Ещё вариант переписать всё на Stored Procedure с использованием Cursors

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson