簡體   English   中英

如何加快查詢速度?

[英]How to speed this query up?

我正在使用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條記錄。問題在於“ order by”,但我需要它:S

抱歉,如果時間太長。

謝謝 :)

您可以通過不使用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);
       // ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM