首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化mysql查询:产品<- N:N ->类别

优化mysql查询:产品<- N:N ->类别
EN

Stack Overflow用户
提问于 2014-01-26 03:36:36
回答 3查看 63关注 0票数 0

是否有任何方法可以以更优化的方式执行此查询?

代码语言:javascript
复制
select SQL_NO_CACHE count(*) from products p
INNER JOIN `products_categories` AS `pc` ON p.id = pc.products_id
where pc.categories_id = 87

我的模式很简单:产品、类别和N:N连接表: products_categories。产品约有400000排。products_categories大约是600000。类别为87的产品约为18000。使用解释给出:

代码语言:javascript
复制
id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  pc  index   products_id products_id 8   NULL    612469  Using where; Using index
1   SIMPLE  p   eq_ref  PRIMARY PRIMARY 4   stagingbagthis.pc.products_id   1   Using index

在我看来,行= 612469的第一行似乎不是一个很好的标志。因此,可以以任何方式优化这个查询吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-26 03:44:21

您需要对products_categories.categories_id进行索引,以便对WHERE子句进行优化。

票数 1
EN

Stack Overflow用户

发布于 2014-01-26 04:09:21

如果您删除了products表,该怎么办:

代码语言:javascript
复制
select SQL_NO_CACHE count(*)
from products_categories` `pc` 
where pc.categories_id = 87;

为此,您需要products_categories(categories_id)上的索引,或者类似的索引,其中categories_id是第一列。

票数 2
EN

Stack Overflow用户

发布于 2014-01-26 03:45:31

你可以试试这个。

代码语言:javascript
复制
select SQL_NO_CACHE count(*) from products p
    INNER JOIN `products_categories` AS `pc` 
        ON p.id = pc.products_id and pc.categories_id = 87

另外,检查索引的基数,我们已经发现基数不正常的情况,我们需要分析表以使我们的执行计划恢复正常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21359350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档