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

时间:2014-01-26 03:36:36

标签: mysql sql

有没有办法以更优化的方式进行此查询?

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。产品大约有40万行。 products_categories大约是600000.类别= 87的产品大约是18000.使用说明给出:

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的第一行不是一个很好的标志。那么,这个查询可以以任何可能的方式进行优化吗?

3 个答案:

答案 0 :(得分:2)

如果您删除了products表格

,该怎么办?
select SQL_NO_CACHE count(*)
from products_categories` `pc` 
where pc.categories_id = 87;

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

答案 1 :(得分:1)

您需要products_categories.categories_id上的索引,以便优化WHERE子句。

答案 2 :(得分:0)

你可以试试这个。

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

同时检查索引的基数,我们发现了基数失控的情况,我们需要分析表格以使我们的执行计划重新排列。