【发布时间】:2017-03-08 17:15:00
【问题描述】:
这个查询不是我写的,我必须优化:
SELECT DISTINCT r.itemid
, r.catid
, i.title
, i.owner
, i.image
, i.background
, i.icon
FROM jos_sobi2_cat_items_relations r
LEFT
JOIN jos_sobi2_item i
ON i.itemid = r.itemid
WHERE
( i.published = 1
AND r.catid > 1
AND ( i.publish_down > '2016-10-26 13:08:02'
OR i.publish_down = '0000-00-00 00:00:00'
)
AND i.itemid IN ( SELECT itemid
FROM jos_sobi2_item
WHERE ( published = 1
AND ( publish_down > '2016-10-26 13:08:02'
OR publish_down = '0000-00-00 00:00:00'
)
)
)
)
GROUP
BY i.itemid
ORDER
BY i.publish_up DESC
LIMIT 0,14
这是解释mysql的命令:
“items”表确实只有 itemid 字段的主键。 “关系”表确实有这 3 个索引:
- catid,itemid PRIMARY BTREE
- itemid BTREE
- catid BTREE
我看到如果我删除 DISTINCT 或 GROUP BY 子句,查询速度很快,否则执行需要超过 1 分钟。
我的第一个想法是删除 DISTINCT 子句,因为 GROUP BY 子句已经完成了这项工作。但我不确定。
对如何优化有帮助吗?
谢谢。
【问题讨论】:
-
此查询甚至无法在其他数据库上运行,包括某些版本的 MySQL,因为您选择的是非聚合列。
-
很遗憾不是我写的,所以才求助
-
published = 1是否暗示 `publish_down = '0...' 不可能发生? -
LEFT JOIN i,然后你GROUP BY和ORDER BYi....--LEFT JOIN在行丢失时提供 NULL。也许应该删除LEFT??
标签: mysql performance join