如何在mysql中消除联合以获得更好的性能

如何在mysql中消除联合以获得更好的性能,mysql,query-optimization,query-performance,Mysql,Query Optimization,Query Performance,嗨,我想获取记录取决于不同的条件我使用的union工作正常,但需要15秒以上,所以我们如何消除union或使查询更快 查询: (SELECT p.professional_id, p.company_name, pbt.name AS professional_business_type_name, pbtm.kukun_url, p.kukun_score, cc.year_founded, p.c

嗨,我想获取记录取决于不同的条件我使用的union工作正常,但需要15秒以上,所以我们如何消除union或使查询更快

查询:

(SELECT p.professional_id,
        p.company_name,
        pbt.name AS professional_business_type_name,
        pbtm.kukun_url,
        p.kukun_score,
        cc.year_founded,
        p.contractor_category,
        p.permit_data_count,
        p.cost_range_code,
        fpcr.cost_min_value,
        fpcr.cost_max_value
 FROM   professional p
        INNER JOIN company_contact cc
                ON cc.company_contact_id = p.company_contact_id
        INNER JOIN professional_business_type_map AS pbtm
                ON pbtm.professional_id = p.professional_id
        INNER JOIN of_professional_business_type_organization AS pbt
                ON pbt.professional_business_type_organization_id =
                   pbtm.professional_business_type_organization_id
        INNER JOIN f_professional_cost_range fpcr
                ON fpcr.cost_range_code = p.cost_range_code
 WHERE  p.professional_id != 262100
        AND cc.company_city_id = 5229
        AND pbt.professional_business_type_organization_id = 2
        AND p.cost_range_code = 4
 ORDER  BY p.kukun_score DESC
 LIMIT  5)
UNION
(SELECT p.professional_id,
        p.company_name,
        pbt.name AS professional_business_type_name,
        pbtm.kukun_url,
        p.kukun_score,
        cc.year_founded,
        p.contractor_category,
        p.permit_data_count,
        p.cost_range_code,
        fpcr.cost_min_value,
        fpcr.cost_max_value
 FROM   professional p
        INNER JOIN company_contact cc
                ON cc.company_contact_id = p.company_contact_id
        INNER JOIN professional_business_type_map AS pbtm
                ON pbtm.professional_id = p.professional_id
        INNER JOIN of_professional_business_type_organization AS pbt
                ON pbt.professional_business_type_organization_id =
                   pbtm.professional_business_type_organization_id
        INNER JOIN f_professional_cost_range fpcr
                ON fpcr.cost_range_code = p.cost_range_code
 WHERE  p.professional_id != 262100
        AND cc.company_city_id = 5229
        AND pbt.professional_business_type_organization_id = 2
 ORDER  BY p.kukun_score DESC
 LIMIT  5)
UNION
(SELECT p.professional_id,
        p.company_name,
        pbt.name AS professional_business_type_name,
        pbtm.kukun_url,
        p.kukun_score,
        cc.year_founded,
        p.contractor_category,
        p.permit_data_count,
        p.cost_range_code,
        fpcr.cost_min_value,
        fpcr.cost_max_value
 FROM   professional p
        INNER JOIN company_contact cc
                ON cc.company_contact_id = p.company_contact_id
        INNER JOIN professional_business_type_map AS pbtm
                ON pbtm.professional_id = p.professional_id
        INNER JOIN of_professional_business_type_organization AS pbt
                ON pbt.professional_business_type_organization_id =
                   pbtm.professional_business_type_organization_id
        INNER JOIN f_professional_cost_range fpcr
                ON fpcr.cost_range_code = p.cost_range_code
 WHERE  p.professional_id != 262100
        AND cc.company_city_id = 5229
 ORDER  BY p.kukun_score DESC
 LIMIT  5)
UNION
(SELECT p.professional_id,
        p.company_name,
        pbt.name AS professional_business_type_name,
        pbtm.kukun_url,
        p.kukun_score,
        cc.year_founded,
        p.contractor_category,
        p.permit_data_count,
        p.cost_range_code,
        fpcr.cost_min_value,
        fpcr.cost_max_value
 FROM   professional p
        INNER JOIN company_contact cc
                ON cc.company_contact_id = p.company_contact_id
        INNER JOIN professional_business_type_map AS pbtm
                ON pbtm.professional_id = p.professional_id
        INNER JOIN of_professional_business_type_organization AS pbt
                ON pbt.professional_business_type_organization_id =
                   pbtm.professional_business_type_organization_id
        INNER JOIN f_professional_cost_range fpcr
                ON fpcr.cost_range_code = p.cost_range_code
 WHERE  p.professional_id != 262100
        AND cc.company_state_id = 5
 ORDER  BY p.kukun_score DESC
 LIMIT  5)
LIMIT 5; 
(可能是错误)您需要在
联盟的
限制5
之前按p.kukun_score DESC下单
。今天,MySQL可能会依次执行
联合的所有部分
,组合所有部分,然后执行
限制
。例如,在未来的某些版本中,它可能并行执行
选择
,从而混淆结果

因此,如果希望第一个
SELECT
中的行首先传递,则必须添加列和
orderby

 ( SELECT 1 AS sequence, ... )
 UNION ALL
 ( SELECT 2 AS sequence, ... )
 ...
 ORDER BY sequence, kukun_score DESC
 LIMIT 5
另外,
UNION
UNION DISTINCT
相同,它为操作添加了重复数据消除过程。也就是说,语义要求评估所有选择

这些
索引可能会有所帮助:

cc:  (company_state_id, company_contact_id, year_founded)
cc:  (company_city_id, company_contact_id, year_founded)
fpcr:  (cost_range_code, cost_max_value, cost_min_value)
这些索引将是“覆盖”的,并且对于您拥有的SQL是最佳的


fpcr
移出欧盟将带来一些好处。也就是说,首先
UNION
所有其他表,然后
JOIN
fpcr
。从中获取两列。这将加快速度,因为它只需要进入该表5次,而不是数千次(4个临时表中有多少行)。

联合确实是性能缓慢的原因吗?单独运行每个查询需要多长时间?(错误)在工会限制5之前,您需要p.kukun_score DESC的订单。是,因为要求仅获取5条记录,输出应来自第一个匹配集例如:在第一次查询中,我们获取了5条记录,然后无需进行第二次查询如果在第一次查询中,我们获取了3条记录,则需要使用union从较低的查询中获取其余两条记录请帮助我获取其他任何查询中的输出方式。。。。谢谢你advance@naveenchennu-我在回答中详细阐述了这一点。