【发布时间】:2015-02-09 10:47:25
【问题描述】:
我见过很多类似我的问题,但在阅读完所有问题后,我感到很困惑。
总而言之 - 我有一个查询,它从表中选择产品并从其他表中添加有关它们的更多信息。
查询:
SELECT
p.product_id,
p.product_name,
p.product_seo_url,
p.product_second_name,
p.product_intro_plain,
p.product_price,
p.product_price_promo,
p.product_promo_expire_date,
p.product_views,
p.product_code,
p.product_exquisite,
p.product_rating,
p.product_votes,
p.product_date_added,
p.product_returned,
p.product_price_returned,
( SELECT gal.image_filelocation
FROM 3w_products_gallery gal
WHERE gal.product_id = p.product_id
ORDER BY show_order ASC
LIMIT 1 ) image_filelocation,
m.man_image_location,
m.man_name,
m.man_seo_url
FROM
3w_products p
LEFT JOIN 3w_manufacturers m
ON p.man_id = m.man_id
LEFT JOIN 3w_products_cat_rel pcr
ON p.product_id = pcr.product_id
WHERE
pcr.ctg_id = '19'
AND p.man_id = '190'
ORDER BY
p.product_id DESC
LIMIT
0, 24
发生的奇怪事情是查询有时会执行 0.001 秒。有时持续 30 多秒。
EXPLAIN 显示的是: http://i.stack.imgur.com/ZNtBX.png
我认为问题在于表的索引。你能告诉我如何设置它们吗?
如果您需要有关表格或其他任何信息的更多信息,请告诉我!
最好, 迪米塔
【问题讨论】:
-
你知道 "WHERE (pcr.ctg_id = '19')" 使 pcr 外连接作为内连接执行吗? (如果您真的想要左连接,请将条件移动到左连接的 ON 子句。)
-
你在
ASC LIMIT 1) image_filelocation,附近漏了一个逗号括号内的查询结束后应该有一个逗号 -
这两者之间应该有“as”。
-
如果在没有最后一个
LIMIT的情况下运行,查询预计返回多少行?在这里,指令ORDER BY DESC LIMIT只能在整个工作完成后进行评估。我猜有些 ctg_id/man_id 部分相当大。 -
@user4419802 - 大约 1000 个结果。
标签: php mysql sql performance