【问题标题】:mySQL multiple Joins for 5 tables with timeout errors5个表的mySQL多个连接超时错误
【发布时间】:2015-08-23 12:29:17
【问题描述】:

我有 5 张桌子:

Categories_groups_cat1

id|order|title(text)

Categories_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_groups_cat1_id==Categories_groups_cat1.id) AND Categories_vs_groups 中的 categories_id 作为表类别 (Categories.id==Categories_vs_groups.categories_id) 的至少一行存在 AND 其中在表 Offers 或 Coupons via 中至少有一行类别栏(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 秒后超时? show variables where variable_name in ('wait_timeout','interactive_timeout')
  • 不!但即使它是一个网站。我需要在 2-3 秒内加载!
  • show create table offers 等所有 3 个表...然后我们可以考虑您的索引策略
  • 您的where 子句正在撤消您的第一个left join。你不妨在select 中使用categories.title_gr 而不是offers.category_gr

标签: mysql sql join timeout


【解决方案1】:

如果您的设置正确,您的查询时间不应超过 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) 上建立索引。

【讨论】:

    【解决方案2】:
    1. 不要在where子句中使用条件WHERE categories.title_gr='$row_best_offer[category_gr]',而是放在On子句中

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

      选择 offer.category_gr, 类别.id,类别.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

      来自优惠 加入类别 上 (categories.title_gr=offers.category_gr 和 categories.title_gr='$row_best_offer[category_gr]' )

      左连接 categories_vs_groups ON categories_vs_groups.categories_id=categories.id

      GROUP BY categories.id 按 category.id 排序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      相关资源
      最近更新 更多