首頁 >後端開發 >php教程 >資料結構 - php 對 mysql 資料庫遍歷的問題

資料結構 - php 對 mysql 資料庫遍歷的問題

WBOY
WBOY原創
2016-12-01 01:27:591485瀏覽

一個關於代理分銷系統的演算法最佳化問題

例如,代理級別分:金、銀、銅三級,我現在是金牌代理A,同時我發展了銀牌代理B、C、D,銀牌代理b發展了銅牌代理E、F,如圖:
A的下級代理清單
╦═══════

╠═ b
║ ╠══ e
║ ╜␕上面這樣一張例圖方法是:(PHP+MYSQL)
先搜尋所有上級代理為A的代理,
例如找到了B代理,再搜尋所有上級代理為B的代理,本次搜尋完畢。
再搜尋C代理 …………
以此類推。

問題:

現在代理資料庫中有三十萬筆記錄,每個代理程式都可以在代理分銷系統中查看自己的下級代理樹,按照以上方法:

每次搜尋都要很久,如果某個代理的下級代理有1000個,那就根本顯示不出來。


我想到的解決辦法是用一個數組存儲所有用戶關係,然後將這個數組存儲為文件,對每次添加刪除用戶都對這個數組同時進行更新操作,然後把想要的數據從數組遍歷出來,然後直接到資料庫中執行一個select就可以了。 。這種辦法可行麼,還有什麼其他解決方案麼


遍歷


想從上層會員找其下的底層會員,會用到遍歷,目測是三叉樹的層次遍歷,這個演算法,目測會對資料庫進行好多好多次的查詢。 。 。太耗費資源了,有沒有什麼替代方案?快取? redis?

回覆內容:

一個關於代理分銷系統的演算法最佳化問題

例如,代理級別分:金、銀、銅三級,我現在是金牌代理A,同時我發展了銀牌代理B、C、D,銀牌代理b發展了銅牌代理E、F,如圖:

A的下級代理清單

╦═══════


╠═ b
║ ╠══ e
║ ╎上面這樣一張例圖方法是:(PHP+MYSQL)
先搜尋所有上級代理為A的代理,
例如找到了B代理,再搜尋所有上級代理為B的代理,本次搜尋完畢。
再搜尋C代理 …………
以此類推。

問題:

現在代理資料庫中有三十萬筆記錄,每個代理程式都可以在代理分銷系統中查看自己的下級代理樹,按照以上方法:
每次搜尋都要很久,如果某個代理的下級代理有1000個,那就根本顯示不出來。

我想到的解決辦法是用一個數組存儲所有用戶關係,然後將這個數組存儲為文件,對每次添加刪除用戶都對這個數組同時進行更新操作,然後把想要的數據從數組遍歷出來,然後直接到資料庫中執行一個select就可以了。 。這種辦法可行麼,還有什麼其他解決方案麼


遍歷


想從上層會員找其下的底層會員,會用到遍歷,目測是三叉樹的層次遍歷,這個演算法,目測會對資料庫進行好多好多次的查詢。 。 。太耗費資源了,有沒有什麼替代方案?快取? redis?


建議分級查詢,按需查詢數據,一次性顯示一個關係樹查詢次數多,耗資源;

這樣的實現可以看無限級分類,使用左右值原理,先序遍歷樹形結構,與商場的分類同原理

先檢查代理級別建索引了沒。

整個樹顯示出來一個頁面也不合適吧,可以做成按需查詢。
金牌代理打開頁面顯示下級的所有銀牌代理,點擊銀牌代理用戶再查看他下級的銅牌代理

謝邀,說說我的幾個思路吧:


如果更新不是很頻繁的話,使用

快取

(資料量30萬,估計只能快取1~2級了),不用每次用SQL查詢。

  1. 多次加載,這個樓上也說了,先加載N級的,等點擊後,再ajax去請求

    N+1級
  2. 的。
  3. 樹結構 無限極分類

    自己搜尋具體答案吧,這個講細了很麻煩,大致原理說一下給你。
    怎麼才能最快的知道誰是自己的下級呢?如果大家來站隊的話,滿足兩個條件即可,1- 你知道誰是第一個,2-保證自己是最後一個(當然也可以知道誰是最後一個,保證自己是第一個)
    根據這個推論為每個節點編上一個合適的序號即可實現快速查找,如select * from tree where indexNumber >= search.node.min && indexNumber

    最終的表結構類似
    id, parent_id(父節點), top_id(根節點,如果有多個樹的時候), indexNumber(樹內的索引編號,top_id+indexNumber是唯一的), min(已我為基準,誰是本分支下的第一個), level(樹高)

    對於你的例子應該類似 (括號內第一個數字是索引號,第二個是min,第三個是樹高)

    <code>            a(6,1,0)
         b(3,1,1)      c(4,4,1)      d(5,5,1)
    e(1,1,2) f(2,2,2)</code>

    這個結構在節點操作的時候較複雜(比如你在f後面加個g,或者刪掉f,那麼abcd都需要重新計算序號),但是搜索就非常快了,一般一次搜索就能出結果啦。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn