5个表的mySQL多个Joins出现超时错误



我有5个表:

类别_组_cat1

id|order|title(text)

类别_vs_groups

id|categories_groups_cat1_id|categories_id

类别

id|title(text)

提供

id|category (text)

优惠券

id|category (text)

我只想在以下情况下显示Categories_groups_cat1中的标题:

通过Categories_groups_cat1_id列在Categories_vs_groups中至少存在一行(Categories_vs_groups.Categories_ggroups_cat1_id==Categories_group_cat1.id(ANDcategories_vs_groups中的categories_id至少作为一行存在于表categories(categories.id=categories_vs_groups.categories_id(中AND其中表中至少有一行通过类别列(Offers.category==categories.title(提供优惠或优惠券!!

我做了以下操作,但我有暂停时间,因为桌子上的优惠或优惠券超过了500000。

SELECT 
            offers.category_gr, 
            categories.id, categories.title_gr,
            categories_vs_groups.categories_id,
            categories_vs_groups.categories_groups_cat1_id AS cat1,
            categories_vs_groups.categories_groups_cat2_id AS cat2
        FROM offers
        LEFT JOIN categories
        ON categories.title_gr=offers.category_gr
        LEFT JOIN categories_vs_groups
        ON categories_vs_groups.categories_id=categories.id
        WHERE categories.title_gr='$row_best_offer[category_gr]'
        GROUP BY categories.id
        order by categories.id

如果设置正确,查询时间不应超过60秒。

你的where子句正在撤销第一个LEFT JOIN(你可能也不需要第二个。因为你是按类别聚合的,我建议从这个开始。然后,offers表只用于筛选,所以你应该考虑它是否真的有必要。

因此,考虑这个查询:

SELECT c.category_gr, c.id, c.title_gr,
       cvg.categories_id, cvg.categories_groups_cat1_id AS cat1,
       cvg.categories_groups_cat2_id AS cat2
FROM categories c JOIN
     offers o 
     ON c.title_gr = o.category_gr LEFT JOIN
     categories_vs_groups cvg
     ON cvg.categories_id = c.id
WHERE c.title_gr = '$row_best_offer[category_gr]'
GROUP BY c.id
ORDER BY c.id;

为了获得最佳结果,需要对categories(title_gr, category_gr, id)offers(category_gr)categories_vs_groups(categories_id)进行索引。

  1. 不要在where子句中使用条件WHERE categories.title_gr='$row_best_offer[category_gr]',而是将其放在On子句中

  2. 第一个左联接是不必要的。

    选择offers.category_gr,categories.id,categories.title_gr,categories_vs_groups.categories_id,categories_vs_ groups.categories_groups_,categories_vs_groups.categories_groups_cat2_id AS cat2

    FROM优惠JOIN类别在(categories.title_gr=offers.category_gr和类别.title_gr='$row_best_offer[category_gr]'(

    LEFT JOIN categories_vs_groupsON categories_vs_groups.categories_id=categories.id

    按类别分组.id按类别排序.id

相关内容

  • 没有找到相关文章

最新更新