【问题标题】:Slow query on ecommerce website (selecting products)电商网站查询慢(选择商品)
【发布时间】:2012-06-08 10:42:48
【问题描述】:
SELECT products.* 
FROM products 
LEFT JOIN product_category 
    ON products.id_product = product_category.id_produs 
LEFT JOIN categories 
    ON product_category.id_category = categories.id_category
INNER JOIN options 
    ON products.id_product = options.id_product 
WHERE categories.id_category = '472' 
AND product_category.id_category = categories.id_category
LIMIT 0, 20

您好,我正在为一个编程竞赛的电子商务网站工作,但我在列出产品的类别页面上遇到了一些问题。

在 MySQL 中有 4 个表:products、categories、product_category(包含 category 和 products 的关系)和 options。选项表包含您可以选择购买的产品的各种属性(如重量、高度、颜色)。我需要在分类页面上调用这些,因为有一个产品过滤器,当我选择颜色:红色时,它会显示所有具有属性颜色的产品:红色。

如果我在 products 表中有 10 000 行,并且每个产品有 5 个选项,那么 options 表将有 50 000 行,问题是查询会很慢,需要 30 多秒展示产品。 我确定问题出在查询上,但我不知道如何做到。为了在 5 秒内获得页面上的产品,我应该在查询中写什么?

【问题讨论】:

  • 能否包含此查询的执行计划?
  • 您的 id_category/id_product 列上是否有 indizes?
  • 发布您的查询的EXPLAIN
  • "我需要在分类页面调用这些,因为有一个产品过滤器,当我选择颜色:红色时,它会显示所有具有属性颜色的产品:红色"。即使未应用过滤器,您是否总是加入选项?如果是这样,您将获得“重复”产品,因为它们乘以所有选项和选项值。当然,这需要更多时间。

标签: php mysql e-commerce


【解决方案1】:

一些事情:你指定了这个关系两次:

AND product_category.id_category = categories.id_category

和

ON product_category.id_category = categories.id_category

这可能会让您的数据库优化器感到困惑。

另一个潜在的优化是将您正在执行 WHERE 子句的列移到表上。将WHERE categories.id_category = '472' 转为product_category.id_category = '472' ` 会减少加入的记录数。

正如一些问题中提到的,EXPLAIN 计划将向您显示查询的哪一部分速度较慢,并在缺少索引时为您提供指示。

【讨论】:

    【解决方案2】:

    确保您在这些表的 id_category 和 id_product 上有索引,然后在其前面粘贴EXPLAIN,然后发布输出,老实说,如果您没有索引,那无论如何都可以完成这项工作.

    【讨论】:

    • 谢谢。索引是问题,因为它们没有被定义。
    • 很高兴它有帮助。确保你接受这个网站上的答案——否则人们不会回答你的更多问题! :)
    猜你喜欢
    • 2014-12-20
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2011-06-11
    • 2011-03-21
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多