Mysql

沒有 CTE 的分層查詢

  • May 21, 2019

我是 MySQL 新手。GetFamilyTree(id)Rolando 在 Find最高級別的分層欄位中建議的功能:有與沒有 CTE問題很棒,但是當 id 大於 999 時,它會掛起。

是否有適用於較大 ID 的解決方案?

你可以做幾件事

事情#1

將所有擴展VARCHAR(1024)VARCHAR(10240)所有儲存過程。這將容納更長的家譜列表。這很重要,因為queue_children如果你有一個不平衡的樹結構,它會變得越來越長。也有可能當 queue_children 的長度為 1024 並且沒有正確分隔時,它可能會進入一些無限循環,試圖正確終止並且永遠不會達到LENGTH(queue_children)0 的條件。

事情#2

GROUP_CONCAT()的最大長度受 group_concat_max_len 限制(預設為 1024)。嘗試將group_concat_max_len擴展為大得離譜的值(5000000000)。

事情#3

增加你的thread_stack,也許是 512K 或 1M。這對於具有遞歸操作的儲存過程來說是必需的,或者在這種情況下,需要更長的局部變數來騰出空間。

當我將部分更改"FORMAT(queue,0)"為simple 時"queue",GetFamilyTree 工作了IDs超過 999。這是因為FORMAT(9999,0) = "9,999"至少在我的系統中。

我還在下面添加了一個唯一索引id和一個非唯一索引parent_id,該程式碼在具有 230k 行的數據集上執行良好。我還將 VARCHAR(1024) 更改為 TEXT。

引用自:https://dba.stackexchange.com/questions/27705