我在制作好的MySQL查询时非常糟糕。我创造了这个:
SELECT SQL_CALC_FOUND_ROWS
`products_stock`.`products_id`,
`products_stock`.`products_stock_attributes`,
`products_stock`.`products_stock_quantity`,
`products`.`manufacturers_id`,
`products_description`.`products_name`
FROM `products_stock`
LEFT JOIN `products`
ON `products_stock`.`products_id` = `products`.`products_id`
LEFT JOIN `products_description`
ON `products_stock`.`products_id` = `products_description`.`products_id`
LEFT JOIN `products_to_categories`
ON `products_stock`.`products_id` = `products_to_categories`.`products_id`
WHERE `products_stock`.`products_stock_quantity` >=3
AND `products`.`products_status` = 1
AND ISNULL(`products`.`products_image`) = false
AND `products`.`products_image` != ""
AND EXISTS(
select * from `allegro`
where `products_stock`.`products_id` = `allegro`.`product_id`
and `allegro`.`attributes` = `products_stock`.`products_stock_attributes`
) = false
products
表有大约17k行,
allegro
表有大约3k行。
查询Idea是选择所有产品,其中stock_quanity> 3,照片在哪里,allegro
表中没有产品ID。
现在查询大约需要10秒钟。我不知道如何优化它。
@SOLVED
我已经为allegro.product_id和allegro.attributes添加了索引,现在查询的时间不到一半。谢谢大家的帮助
答案 0 :(得分:2)
摆脱EXISTS ( SELECT … ) = FALSE
的东西。
将其转化为以下内容:
LEFT JOIN allegro
ON products_stock.products_id = allegro.product_id
AND allegro.attributes = products_stock.products_stock_attributes
…
WHERE allegro.product_id IS NULL
请参阅MySQL文档中的Rewriting Subqueries as Joins章节。
进一步的建议:
products_to_categories
ISNULL(…) = FALSE
写… IS NOT NULL
答案 1 :(得分:0)
在尝试以下方法之前,检查您的表引擎设置为innoDB并将其正确编入索引,然后您可以尝试straight join。它将首先强制查看左表。
另一种方法是使用memcache进行慢速查询。您可以使用此方法将查询结果缓存到数组中,从而避免频繁查询数据库。缓存的结果可以在指定的时间段后更新。