如何优化下面的SQL查询?

时间:2014-02-12 06:11:18

标签: mysql sql database performance query-optimization

我想找到一个可以在六个表之一中的实体名称。为此我写了一个函数getEntityName(entityid)。代码工作正常,因为我使用UNION表。但问题是,这些表包含大量数据,因此函数需要很长时间才能返回输出。我不确定是否可以使用JOIN我可以优化此功能。我正在分享功能定义;如果有任何方法可以优化此功能,请告诉我:

delimiter $$
drop function if exists getEntityName$$
create function getEntityName(entityid int) returns varchar(128)
    begin
return(
        select
            shortname as entityname 
        from partnerships
         where partnerships.pshipentid = entityid 
        union
        select
            concat(lastname, ', ', firstname) as entityname
        from individuals
        where individuals.indentid = entityid 
        union
        select
            shortname as entityname
        from firms
        where firms.firmentid = entityid 
        union
        select
            shortname as entityname
        from funds
        where funds.fundentid = entityid 
        union
        select 
            entityshortname as entityname
        from deletedentities
        where deletedentities.entityid = entityid
    );
    end$$

1 个答案:

答案 0 :(得分:1)

函数或unions

中的查询没有太多错误

但是,存在以下索引的性能至关重要:

  • 伙伴关系(pshipentid)
  • 个体(indentid)
  • 商行(firmentid)
  • 资金(fundentid)
  • deletedentities(ENTITYID)

另一个可能的问题是,如果在大量数据集上评估函数,它将一次评估一行,例如

select getEntityName(firms.id)
from firms;

在这种情况下,基于集合的方法将是更可取的。 MySql没有表值参数(即你不能将一堆entityid传递给函数),但还有其他workarounds