mysql樹目錄查詢語句優(yōu)化提高查詢效率
在做mysql樹目錄查詢的時候遇到了一個很奇妙的現(xiàn)象
我是先創(chuàng)建了一個樹目錄查詢的函數(shù)叫 getDeptList()然后單獨執(zhí)行查詢函數(shù)的效率很快


但當我放到sql語句里加個判斷執(zhí)行就會很慢了


累計查詢出20條數(shù)據(jù)竟然要了0.5秒,那如果查出幾百條不就1秒了 -_-||
后來想了一下可能是每次查詢self_dept表的時候都會再執(zhí)行一遍樹目錄的函數(shù)
然后就把sql語句改成了這樣


可以看到,速度大幅度降低直接到了0.06
這里的優(yōu)化思路是先計算好函數(shù)的結(jié)果,讓函數(shù)只執(zhí)行一遍,而不是根據(jù)self_dept表的判斷進行多次計算
這里順便記錄一下mysql樹目錄排序的方法
sql:
select dept_id from (
select t1.dept_id,
if((find_in_set(parent_id, @pids) > 0 or find_in_set(dept_id, @pids) > 0), @pids := concat(@pids, ',', dept_id), 0) as ischild
from (
select dept_id,parent_id,dept_name from basis_sys_dept order by parent_id, dept_id
) t1,
(select @pids := id) t2
) t3 where ischild != 0
這個是可以直接寫在sql語句內(nèi)的,不過有個缺點:完全依靠排序,如果有子級在父級上面就會搜不到
sql:
delimiter //
CREATE FUNCTION `getLst`(rootId INT)
RETURNS varchar(1000)
BEGIN
DECLARE sTemp VARCHAR(1000);
DECLARE sTempChd VARCHAR(1000);
SET sTemp = '$';
SET sTempChd =cast(rootId as CHAR);
WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(dept_id) INTO sTempChd FROM self_dept where FIND_IN_SET(parent_id,sTempChd)>0;
END WHILE;
RETURN sTemp;
END
//
這個是在mysql里創(chuàng)建一個函數(shù),可以暫無發(fā)現(xiàn)什么bug(如有發(fā)現(xiàn)bug我會回來修改的)
(在復制使用的時候記得修改里面的表名和表字段 我的表:self_dept,id:dept_id,父級id:parent_id)
到此這篇關(guān)于mysql樹目錄查詢語句優(yōu)化的文章就介紹到這了,更多相關(guān)mysql樹目錄查詢語句優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux系統(tǒng)下實現(xiàn)遠程連接MySQL數(shù)據(jù)庫的方法教程
MySQL默認root用戶只能本地訪問,不能遠程連接管理mysql數(shù)據(jù)庫,Linux如何開啟mysql遠程連接?下面這篇文章主要給大家介紹了在Linux系統(tǒng)下實現(xiàn)遠程連接MySQL數(shù)據(jù)庫的方法教程,需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06
MySQL可直接使用的查詢表的列信息(實現(xiàn)方案)
本文介紹了如何使用SQL快速將下劃線命名的表字段轉(zhuǎn)換為駝峰命名格式,包括確定下劃線位置、找到第一個字符、截取并拼接字符串等步驟,通過使用LOCATE、CONCAT、UCASE和LOWER等函數(shù),可以實現(xiàn)高效的字段命名轉(zhuǎn)換,感興趣的朋友跟隨小編一起看看吧2025-01-01

