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 (包含类别和产品的关系)和options。options表包含您可以选择购买的产品的各种属性(如重量、高度、颜色)。我需要在分类页面上调用它们,因为有一个产品过滤器,当我选择color: red时,它将显示属性color: red的所有产品。
如果我在products表中有10000行,而每个产品都有5个选项,那么options表将有50000行,问题是查询将非常慢,并且需要30秒以上的时间来显示产品。我确定问题出在查询上,但我不知道该怎么做。为了在5秒内获得页面上的产品,我应该在查询中写些什么?
发布于 2012-06-04 18:54:12
确保在这些表的id_category和id_product上有索引,然后将EXPLAIN
放在前面,并发布输出,老实说,如果没有索引,这可能会完成这项工作。
发布于 2012-06-05 08:55:52
有几件事:你指定了这个关系两次:
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
计划将向您显示查询的哪个部分速度较慢,并提示您是否缺少索引。
https://stackoverflow.com/questions/10879953
复制相似问题