Как ускорить этот запрос? - PullRequest
2 голосов
/ 09 марта 2012

Я использую фреймворк yii для создания веб-сайта, заботится о стихах, словах и прочем ...

проблема в том, что в базе данных содержится более 250 000 записей сообщений и более 500 000 записей ключевых слов.и отношения: S

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

что я сделалпока что кэширует запрос, но он все еще медленный при первом его открытии, и это большая проблема!

вот мой код:

    public function getRelatedMessages()
    {
        $id = $this->id;
        $dependency = "select `messages`.id,count(id) as tag_count from messages left join `messages_tags` on `messages`.`id` = `messages_tags`.mid 
            where `messages_tags`.`tagid` in (select `tags`.`id` from tags left join `messages_tags` on tags.id = `messages_tags`.tagid 
            where `messages_tags`.`mid` = {$id}) and id <> {$id} group by id order by tag_count desc";
        $dependency =  Messages::model()->cache(900)->findAllBySql($dependency);
        foreach ($dependency as $dependency) {
            $dependency1[] = $dependency['id'];
        }
        $dependency = implode(", ", $dependency1);
        $sql = "select * from messages where id in ({$dependency})  limit 4";
        $relateds =  Messages::model()->findAllBySql($sql);
        $db = array();
        foreach($relateds as $related) {
            $db[] = $related;
        }
        if(!$relateds || count($db)<4) {
            $limit = 4-count($db);
            $sql = "select `messages`.id, `messages`.url_key, `messages`.photo_url, `messages`.message from messages order by rand(), likes desc, comments desc, impressions desc, reported asc limit {$limit};";

            $relateds =  Messages::model()->cache(900)->findAllBySql($sql);
            foreach($relateds as $related) {
                $db[] = $related;
            }
        }

        return $db;
    } 

код выше выбирает только 4записи из связанных сообщений после их фильтрации, упорядочивания и прочее .. проблема в "упорядочить по", но мне это нужно: S

извините, если это было слишком долго ..

спасиботы:)

1 Ответ

0 голосов
/ 13 марта 2012

Вы можете улучшить первый запрос, не используя findAllBySql() и создавая экземпляры всех классов ActiveRecord.Они вам не нужны, поэтому используйте простой SQL-запрос, подобный следующему (запрос остался прежним, но код изменился):

       // ...
       $dependency = $this->dbConnection->createCommand("
           select `messages`.id, count(id) as tag_count
           from messages left join `messages_tags` on `messages`.`id` = `messages_tags`.mid 
           where
               `messages_tags`.`tagid` in 
                  (select `tags`.`id` from tags left join `messages_tags` on tags.id = `messages_tags`.tagid where `messages_tags`.`mid` = {$id})
               and id <> {$id}
           group by id order by tag_count desc")->queryColumn();

       $dependency = implode(", ", $dependency);
       $sql = "select * from messages where id in ({$dependency})  limit 4";
       $relateds =  Messages::model()->findAllBySql($sql);
       // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...