0

我有一个具有以下架构的 MySql 表。

table_products - "product_id", product_name, product_description, product_image_path, brand_id
table_product_varient - "product_id", "varient_id", product_mrp, product_sellprice, product_imageurl
table_varients - "varient_id", varient_name
table_product_categories - "product_id", "category_id"

select这是我用来获取用户提供的类别数据的 Mysql查询。

select * from table_products, table_product_varients, table_varients, table_product_categories where table_product_categories.category_id = '$cate_id' && table_product_categories.product_id = table_products.product_id && table_products.product_id = table_product_varients.product_id && table_varients.varient_id = table_product_varients.varient_id

问题是,由于表包含很多产品,并且每个产品都包含很多变体,因此获取数据需要花费太多时间。我怀疑,随着数据的增长,获取项目的时间会增加。是否有任何优化的方法来实现相同的目标。

您的帮助将不胜感激。

德韦什

4

3 回答 3

2

您可以使用 EXPLAIN 命令查看服务器中发生的情况。然后您可以通过创建索引来优化请求。

一些链接:

于 2013-10-04T08:08:43.880 回答
2

下面的查询将是一个开始,或类似的东西

SELECT
    * 
FROM
    table_products P
INNER JOIN
    table_product_categories PC 
ON
    PC.product_id = P.product_id
INNER JOIN
    table_product_varients PV
ON
    P.product_id = PV.product_id
INNER JOIN
    table_varients V
ON
    V.varient_id = PV.varient_id
where 
    table_product_categories.category_id = '$cate_id' 

并且正如建议的那样,您是否真的需要返回*,因为这确实意味着从查询中的所有表中选择所有列,正如我们从连接本身所知道的那样,这些列是重复的。

您应该对表使用索引以加快查询速度,设置连接表之间的关系,这也将确保引用完整性。

希望这是有道理的并有所帮助:)

于 2013-10-04T08:16:52.540 回答
1

是的,您是正确的,您上面使用的查询效率不高:

ON您可以通过使用子句而不是子句来获得与上述相同的结果where

它们之间的区别在于,where 子句获取所有行,然后根据指定的条件过滤掉。

在 ON 子句的情况下,连接仅发生在满足 ON 子句中指定的条件的行上

所以..使您的查询如下:

所以使用连接而不是使用 where 子句..

希望这可以帮助..

于 2013-10-04T08:07:41.080 回答