запрос доктрины работает медленно почему? - PullRequest
0 голосов
/ 03 июня 2011

может мне помочь.

Я выполняю запрос с использованием доктрины.

Я сделал индексирование и ссылку на foriegnkey для необходимых таблиц

вот мой запрос

echo "step1";echo date('h:i:s A');echo "<br/>";
        $query = new Doctrine_Query();
        $whereCond ='';
        $where='eng.id='.$campid;
        $select='';
        $search = '';
        /*if($queryv!=''){

             $where .= " AND c.".$quickSearchType." LIKE '%".$queryv."%' ";
        }*/
        if($letterPressed == 'All')
        {
            $where .="";
        }
        else if($letterPressed == 'Radian6')
        {
            $where .=" AND c.news_type = 1";
        }
        else if($letterPressed == 'Google News')
        {
            $where .=" AND c.news_type = 3";
        }
        else if($letterPressed == 'Google Blogs')
        {
            $where .=" AND c.news_type = 4";
        }
        else if($letterPressed == 'RSS Feeds')
        {
            $where .=" AND (c.news_type = 5 or  c.news_type = 6)";
        }
        else if($letterPressed == 'Hide Twitter')
        {
            $where .=" AND c.url NOT LIKE '%twitter.com%'";
        }
        else if($letterPressed == 'Hide Facebook')
        {
            $where .=" AND c.url NOT LIKE '%facebook.com%'";
        }
        else if($letterPressed == 'Hide Facebook-twitter')
        {
            $where .=" AND (c.url NOT LIKE '%twitter.com%' AND c.url NOT LIKE '%facebook.com%')";
        }
        else if($letterPressed == 'Show Twitter')
        {
            $where .=" AND c.url LIKE '%twitter.com%'";
        }
        else if($letterPressed == 'Show Facebook')
        {
            $where .=" AND c.url LIKE '%facebook.com%'";
        }
        else if($letterPressed == 'show Facebook-twitter')
        {
            $where .=" AND (c.url  LIKE '%twitter.com%' OR c.url LIKE '%facebook.com%')";
        }

        if($queryv!='' && $quickSearchType == 'title' && (trim($letterPressed) != 'Law' && trim($letterPressed) != 'LS Translate') ){

             $search = ' LOWER(c.title) LIKE "%'.mysql_real_escape_string($queryv).'%" ';
             //$search = ' LOWER(c.title) LIKE ?';
        }
        if($queryv!='' && $quickSearchType == 'domain')
        {
             $search = ' LOWER(c.domain) LIKE "%'.mysql_real_escape_string($queryv).'%" ';
             //$search = ' LOWER(c.domain) LIKE ?';

        }
        echo "step2";echo date('h:i:s A');echo "<br/>";

        $select='c.id, c.campaign_id, c.title as title, c.domain, c.news_type,c.url, c.active, c.article_date, c.created_date, c.modified_date, t.language_id, t.tr_translated_date, t.tr_translated_by, t.translation_state, t.tr_title, t.raw_title';
        if(trim($letterPressed) == 'Original')
        {
            $select='c.id, c.campaign_id, c.title as title, c.domain, c.news_type,c.url, c.active, c.article_date, c.created_date, c.modified_date, t.language_id, t.tr_translated_date, t.tr_translated_by, t.translation_state';
        }
        if(trim($letterPressed) == 'Law')
        {
            $select='c.id, c.campaign_id, c.domain, c.news_type,c.url, c.active,c.article_date, c.created_date, c.modified_date, t.raw_title as title, t.language_id, t.tr_translated_date, t.tr_translated_by, t.translation_state';
            if($queryv!='' && $quickSearchType == 'title'){

             $search = ' LOWER(t.raw_title) LIKE "%'.mysql_real_escape_string($queryv).'%"';
             //$search = ' LOWER(t.raw_title) LIKE ?';

            }
        }
        if(trim($letterPressed) == 'LS Translate')
        {
            $select='c.id, c.campaign_id, c.domain, c.news_type,c.url, c.active, c.article_date, c.created_date, c.modified_date, t.tr_title as title, t.language_id, t.tr_translated_date, t.tr_translated_by, t.translation_state';
            $where .=" AND t.translation_state = 1";
            if($queryv!='' && $quickSearchType == 'title'){

             $search = ' LOWER(t.tr_title) LIKE "%'.mysql_real_escape_string($queryv).'%" ';
             //$search = ' LOWER(t.tr_title) LIKE ?';
            }
        }
        $whereCond.=$where;  
        // , array("%".mysql_real_escape_string($queryv)."%")
        echo "step3";echo date('h:i:s A');echo "<br/>";
        $query->select($select)
              ->from('News c')
              ->where($whereCond)
               ->addWhere('eng.tr_language_id=t.language_id')
               ->andWhere('c.created_date >= DATE_SUB(CURDATE(),INTERVAL 90 DAY)' );
        if(!empty($search))
            $query->andWhere($search);     
        $query->leftJoin('c.TranslatedNews t on t.news_id = c.id')
              ->leftJoin('c.Campaigns eng on eng.id = c.campaign_id')            
              ->orderBy('c.'.$sortName. ' ' . $sortOrder)
              ->groupBy('c.title')
              ->addGroupBy('c.url')
              ->limit(10);
            echo "step4";echo date('h:i:s A');echo "<br/>"; 
            //echo $query->getSqlQuery();exit;
            $result = $query->execute(array(),Doctrine::HYDRATE_ARRAY);
            echo "step5";echo date('h:i:s A');echo "<br/>";exit;
            return $result;

для выполнения запроса требуется 8 секунд.Как сделать так, чтобы этот запрос выполнялся быстро

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 03 июня 2011

Поскольку LIKE медленный при увеличении таблицы.

Вы должны реализовать Full Text search

Так что вы можете сделать

WHERE MATCH(fields) AGAINST('your search')
0 голосов
/ 03 июня 2011

Сравнение LIKE на самом деле является поиском «содержит подстроку», когда вы ставите подстановочные знаки в% поискового термина%.Типичные преимущества отсортированного индекса недоступны при таком поиске (потому что ваш подстановочный знак говорит, что игнорировать символы в начале значения);и поэтому каждое значение в таблице (в соответствующем столбце) должно быть проверено, чтобы увидеть, содержит ли оно подстроку.

Если вы искали в телефонной книге ГДЕ ФАМИЛИЯ НРАВИТСЯ '% els%', вам придется проверять каждыйфамилию, тогда как если вы указали ГДЕ ФАМИЛИЯ НРАВИТСЯ 'Nels%', вы можете искать только по именам -N-, исключая имена, начинающиеся с любой другой буквы.Последний может использовать индекс.

Создатели базы данных могут помочь вам, выделив домен из URL-адреса и поместив домен в его собственный столбец и проиндексировав этот столбец.Тогда вы можете сделать сравнение на равенство WHERE DOMAIN = 'somedomain', и значение будет найдено очень быстро и эффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...