繁体   English   中英

慢的MySQL查询,还有3个左联接

[英]Slow Mysql Query with 3 left join

我们有一个电子商店,在这个电子商店中,类别和产品之间存在许多复杂的链接。

我使用分类表来存储产品-类别和产品-产品之间的关系作为子产品。

产品可能属于多个类别。 产品可以是子产品,也可以是其他产品的子产品。 (可能不止一个)产品可能是另一个产品的模块(可能不止一个)

查询别名:pr-产品ct-类别sp-Sub产品md-模块

Select pr.*,ifnull(sp.destination_id,0) as `top_id`,
    ifnull(ct.destination_id,0) as `category_id` 
from Products as pr
Left join Taxonomy as ct
  on (ct.source_id=pr.id and ct.source='Products' and ct.destination='Categories')
Left join Taxonomy as sp 
  on (sp.source_id=pr.id and sp.source='Products' and sp.destination='Products' and sp.type='TOPID')
Left join Modules as md
  on(pr.id = md.product_id)
where pr.deleted=false
  and ct.destination_id='47'
  and sp.destination_id is null
  and md.product_id is null
order by pr.order,pr.sub_order

有了这个查询; 我正在尝试将所有产品归为Category_id = 47,而不是任何产品的模块,而不是任何产品的子产品。

此查询需要23秒。 产品中有7.820条记录,模块中有3.200条记录,分类法中有19.000条记录

我要说的是,MySQL每个查询只能使用一个索引,但是现在看来情况已不再如此。 我也在另一个答案中遇到了这个问题: http : //dev.mysql.com/doc/mysql/en/index-merge-optimization.html

但是,这可能对您没有帮助。

过去,当我遇到无法优化MySQL的查询时,我就决定使用后台作业在另一个表中预先计算答案。

您正在尝试做的事情看起来非常适合像neo4j这样的图形数据库。

众所周知,MySQL的优化器不利于自动将外部联接更改为内部联接,它先执行外部联接,然后开始过滤数据。

在您的情况下,产品和分类法之间的联接可以重写为内部联接(ct.destination_id = '47'上存在WHERE条件)。

请尝试这是否会改变执行计划并提高性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM