MySQL - 索引问题

时间:2016-02-10 03:03:25

标签: mysql sql indexing

我有点奇怪的情况,我正在努力理解它。

我有两张桌子,我会列出必要的字段。

products [MyIsam -- due to full text search]  
   product_id [primary index]

大约有1,000,000行。

website_products [InnoDB]  
    website_id [primary]  
    product_id [primary]

大约有6,000,000行。

现在当我查询时......

SELECT
    COUNT(`product_id`)
FROM `products`

返回0.109秒,结果为“1030650”

SELECT
    COUNT(wp.`product_id`)
FROM `website_products` AS wp 
WHERE wp.`website_id` = 1133

返回0.577秒,结果为“104150”

SELECT
    COUNT(wp.`product_id`)
FROM `website_products` AS wp 
LEFT JOIN `products` AS p ON p.product_id = wp.product_id
WHERE wp.`website_id` = 1133

38.173秒 返回,结果为“104150”

EXPLAIN SELECT产生:

1   SIMPLE  wp  ref PRIMARY,website_id  PRIMARY 4   const   204392  Using index
1   SIMPLE  p   eq_ref  PRIMARY PRIMARY 4   imaginer_system.wp.product_id   1   Using index

为什么加入桌子的时间会更长?我怎样才能减少呢?

2 个答案:

答案 0 :(得分:0)

对于此查询:

SELECT COUNT(wp.`product_id`)
FROM `website_products` wp LEFT JOIN
     `products` p
      ON p.product_id = wp.product_id
WHERE wp.`website_id` = 1133;

最佳索引为:website_products(website_id, product_id)products(product_id)

答案 1 :(得分:0)

我找到了答案:MyIsam和InnoDB不能很好地放在一起。

此链接有助于:
Joining InnoDB tables with MyISAM tables

我将products表转换为InnoDB,因为FullText功能应与MyIsam匹配,搜索时间从38秒变为0.4

我们在一台服务器上运行了300个站点,这台服务器最大化了一个带有6个CPU的服务器,并且使用了1/2个CPU。