0

私は大きなmysqlテーブルを持っています - 基本的にわずかに変更されたLDAPダンプです。12万人の従業員。

テーブルは多くのことに必要ですが、サーバーを固定するタスクが 1 つあります。それは再帰クエリです。各従業員には従業員がいます。行の id およびスーパーバイザー id。やさしい親子関係。ただし、私たちが持っているアプリケーションの 1 つは大量メール アプリです。また、LDAP テーブルを使用して、特定のマネージャーの下にあるすべての従業員を検索します。これは 6 ~ 10 レベルの深さになり、10 ~ 20K 行を含む場合があります。強烈です。現在のシステムは、大規模なクエリに対して機能していません。

では、親子関係をネストされたセットに自動化するにはどうすればよいでしょうか? これは私がmysqlで行ったことを本当に超えているので、助けていただければ幸いです。

また、これが100回も尋ねられていないのはどうしてですか?

4

2 に答える 2

0

仕事をするストアドプロシージャを作成しました。これはスーパーバイザー ID で始まり、すべての子とその子を検索します。循環関係に注意!

前提: 従業員テーブルには PID (個人) と SupID (スーパーバイザー) がある

Emailtable には PID、PersonName、Email、Nodelevel (int) があり、最初は空です。

Nodeup(1,SupervisorID) を呼び出します (curnode int のパラメータ、supid int のパラメータ)

BEGIN
#Routine body goes here...
declare newnode int;
if curnode = 1 then
insert emailtable (pid,personname,email,nodelevel) select pid,personname,email,1 from  employees where pid = superid;
end if;

insert emailtable(personname,pid,email,nodelevel) select personname,pid,email,curnode+1 
        from employees where supid in (select pid from emailtable where curnode = emailtable.nodelevel);
    set newnode = (select max(nodelevel) from emailtable);
    if newnode > curnode then
        call nodeup(Newnode,0);
    end if;
END
于 2013-07-23T22:45:55.887 に答える