0
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 个选项,那么选项表将有 50 000 行,问题是查询会很慢,并且显示产品需要 30 多秒. 我确定问题出在查询上,但我不知道如何做到。为了在 5 秒内获得页面上的产品,我应该在查询中写什么?

4

2 回答 2

0

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

于 2012-06-04T10:54:11.877 回答
0

一些事情:您指定了这种关系两次:

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计划将向您显示查询的哪一部分速度较慢,并在缺少索引时为您提供指示。

于 2012-06-05T00:55:51.773 回答