thinkphp無限分類求改造 速度極慢

來源:互聯網
上載者:User
我知道我這麼寫 是很慢的
我知道思路 但是做不出來
應該一次性將所有資料取出來
然後排序 求賜教

        function getBookmarkcategory($pid = 0, &$result = array(), $spac = 0)        {            if(MODULE_NAME=="Home"){                $ispublic=0;                $uid=session('uid');                $ispublic+="And bookmarkcategory_staffid = $uid";            }else if(MODULE_NAME=="Admin"){                $ispublic=1;            }            $Model = new Model();            $spac = $spac + 8;            $res=$Model->query( "SELECT * FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort");            foreach($res as $key=>$value){                $result[]=$res[$key];                getBookmarkcategory($value['bookmarkcategory_id'],$result,$spac);            }            return $result;        }        $list = getBookmarkcategory();        return $list;

回複內容:

我知道我這麼寫 是很慢的
我知道思路 但是做不出來
應該一次性將所有資料取出來
然後排序 求賜教

        function getBookmarkcategory($pid = 0, &$result = array(), $spac = 0)        {            if(MODULE_NAME=="Home"){                $ispublic=0;                $uid=session('uid');                $ispublic+="And bookmarkcategory_staffid = $uid";            }else if(MODULE_NAME=="Admin"){                $ispublic=1;            }            $Model = new Model();            $spac = $spac + 8;            $res=$Model->query( "SELECT * FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort");            foreach($res as $key=>$value){                $result[]=$res[$key];                getBookmarkcategory($value['bookmarkcategory_id'],$result,$spac);            }            return $result;        }        $list = getBookmarkcategory();        return $list;

不說需求,表結構,誰知道那麼一坨代碼是幹嗎用的

php無限分類 一種演算法 可以參考 PHPCMS category 表結構。它是把所有的父(樹)結點與子(樹)結點都遞迴存入資料庫。可以一次記取存所有資料到數組再遞迴。

可以參考下面問題的答案,“分類”和許可權管理中的部門類似
http://segmentfault.com/q/1010000004365843/a-1020000004365952

            $res=$Model->query( "SELECT * FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort");

應該是慢在這裡,完全可以想辦法不要放到遞迴裡面查詢,先一次性查詢出來,然後遞迴也比這個快N倍啊

function getBookmarkcategory($pid = 0, &$result = array(), $spac = 0)        {            if(MODULE_NAME=="Home"){                $ispublic=0;                $uid=session('uid');                $ispublic+="And bookmarkcategory_staffid = $uid";            }else if(MODULE_NAME=="Admin"){                $ispublic=1;            }            $Model = new Model();//竟然是遞迴 每次尋環 都要執行個體模型  慢的原因 之一 放到函數外面            $spac = $spac + 8;            $res=$Model->query( "SELECT * FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort");            //SELECT *   這種寫法 效能低 bookmarkcategory_pid=$pid--bookmarkcategory_pid 是否索引             foreach($res as $key=>$value){                $result[]=$res[$key];                getBookmarkcategory($value['bookmarkcategory_id'],$result,$spac);            }            return $result;        }        //速度最好的是 資料一次在外部取出 再來遞迴 很快 mysql 操作很慢的

一次查詢查出所有,然後迴圈,使用傳值引用調整資料結構,然後就出來了

可以用左右值樹
http://wenku.baidu.com/view/cb2bb3eeaeaad1f346933ffd.html

效率非常高

可以用資料字典做,一次性拿出全部資料,再迴圈一次即可

因為你在不停地從外部儲存讀取資料。如果資料量不大,一次性可以把所有需要的資料讀取出來,然後在記憶體中構造樹。哪些是需要的資料在資料產生的時候就可以把關聯表儲存下來。如果資料量非常大,可以考慮按樹的層級儲存關聯資料,分幾次讀取。
PS: 看你的代碼裡,要小心SQL注入

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.