1

mysql:sql语句分为两条sql写 对比 合成一条sql写,性能相差一千多倍,如何解决?

 2 years ago
source link: https://www.oschina.net/question/155761_2325625
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

mysql:sql语句分为两条sql写 对比 合成一条sql写,性能相差一千多倍,如何解决?

Tom-Lin 发布于 今天 10:42

我有一个树状结构的表,想找 指定节点 下的 所有子孙节点。表结构用 parentId进行关联:

我的实现方式是:

  1. 写一个函数生成指定节点的所有子节点id合成的一个字符串:
    CREATE FUNCTION `queryChildren`( cId INT ) RETURNS varchar(20000) CHARSET utf8
    BEGIN
    	DECLARE sTemp VARCHAR ( 20000 );
    	DECLARE sTempChd VARCHAR ( 20000 );
    	
    	SET sTemp = '';
    	
    	SET sTempChd = cast( cId AS CHAR );
    	
    	WHILE sTempChd IS NOT NULL DO
    		SET sTemp = CONCAT( sTemp, ',', sTempChd );
    		SELECT group_concat( CatalogID ) INTO sTempChd 
    		FROM his_ha_catalog 
    		WHERE FIND_IN_SET( parentId, sTempChd ) > 0;
    	END WHILE;
    	
    	RETURN sTemp;
    END
  2. 用一条sql语句查找数据(这样查询,花费时间90秒):
    SELECT * FROM his_ha_catalog where FIND_IN_SET(CatalogID, queryChildren(75));
  3. 用两条sql语句查找数据(这样查询,花费时间0.05秒):
    SELECT queryChildren(75) into @childrenids;
    SELECT * FROM his_ha_catalog where FIND_IN_SET(CatalogID, @childrenids);

请问,象这样的问题,如果想优化一条sql语句的实现,有什么办法吗?


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK