如何在mysql中消除联合以获得更好的性能
嗨,我想获取记录取决于不同的条件我使用的union工作正常,但需要15秒以上,所以我们如何消除union或使查询更快 查询:如何在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
(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-我在回答中详细阐述了这一点。