我有点奇怪的情况,我正在努力理解它。
我有两张桌子,我会列出必要的字段。
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
为什么加入桌子的时间会更长?我怎样才能减少呢?
答案 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。