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


但當(dāng)我放到sql語(yǔ)句里加個(gè)判斷執(zhí)行就會(huì)很慢了


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


可以看到,速度大幅度降低直接到了0.06
這里的優(yōu)化思路是先計(jì)算好函數(shù)的結(jié)果,讓函數(shù)只執(zhí)行一遍,而不是根據(jù)self_dept表的判斷進(jìn)行多次計(jì)算
這里順便記錄一下mysql樹(shù)目錄排序的方法
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
這個(gè)是可以直接寫(xiě)在sql語(yǔ)句內(nèi)的,不過(guò)有個(gè)缺點(diǎn):完全依靠排序,如果有子級(jí)在父級(jí)上面就會(huì)搜不到
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
//
這個(gè)是在mysql里創(chuàng)建一個(gè)函數(shù),可以暫無(wú)發(fā)現(xiàn)什么bug(如有發(fā)現(xiàn)bug我會(huì)回來(lái)修改的)
(在復(fù)制使用的時(shí)候記得修改里面的表名和表字段 我的表:self_dept,id:dept_id,父級(jí)id:parent_id)
到此這篇關(guān)于mysql樹(shù)目錄查詢(xún)語(yǔ)句優(yōu)化的文章就介紹到這了,更多相關(guān)mysql樹(shù)目錄查詢(xún)語(yǔ)句優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux系統(tǒng)下實(shí)現(xiàn)遠(yuǎn)程連接MySQL數(shù)據(jù)庫(kù)的方法教程
MySQL默認(rèn)root用戶(hù)只能本地訪問(wèn),不能遠(yuǎn)程連接管理mysql數(shù)據(jù)庫(kù),Linux如何開(kāi)啟mysql遠(yuǎn)程連接?下面這篇文章主要給大家介紹了在Linux系統(tǒng)下實(shí)現(xiàn)遠(yuǎn)程連接MySQL數(shù)據(jù)庫(kù)的方法教程,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-06-06
MySQL 創(chuàng)建主鍵,外鍵和復(fù)合主鍵的語(yǔ)句
MySQL 創(chuàng)建主鍵,外鍵和復(fù)合主鍵的方法,需要的朋友可以參考下。2009-12-12
MySQL可直接使用的查詢(xún)表的列信息(實(shí)現(xiàn)方案)
本文介紹了如何使用SQL快速將下劃線命名的表字段轉(zhuǎn)換為駝峰命名格式,包括確定下劃線位置、找到第一個(gè)字符、截取并拼接字符串等步驟,通過(guò)使用LOCATE、CONCAT、UCASE和LOWER等函數(shù),可以實(shí)現(xiàn)高效的字段命名轉(zhuǎn)換,感興趣的朋友跟隨小編一起看看吧2025-01-01
一些mysql啟動(dòng)參數(shù)的說(shuō)明和優(yōu)化方法
要求MySQL能有的連接數(shù)量。當(dāng)主要MySQL線程在一個(gè)很短時(shí)間內(nèi)得到非常多的連接請(qǐng)求,這就起作用,然后主線程花些時(shí)間(盡管很短)檢查連接并且啟動(dòng)一個(gè)新線程。2011-04-04

