以下有什么区别?第一个查询需要0.00才能执行,第二个查询需要0.00才能执行,第三个需要0.71才能执行。出于某种原因,当我在示例3中将两个查询放在一起时,执行需要更长的时间。表流量有一个短代码和ip的索引,表重定向有一个关于campaign和pubid的索引。
是否有其他类型的索引可以加快这种情况的发展?
查询1:(0.00执行)
SELECT * FROM traffic
WHERE shortcode IN ('CODE1')
GROUP BY ip
查询2:(0.00执行)
SELECT shortcode FROM redirect WHERE campaign = '385' AND pubid = '35'
查询3:(0.71执行)
SELECT * FROM traffic
WHERE shortcode IN
(SELECT shortcode FROM redirect WHERE campaign = '385' AND pubid = '35')
GROUP BY ip
答案 0 :(得分:3)
在旧版本的MySQL中,IN ( SELECT ... )
构造的优化程度非常低。对于traffic
中的每一行,它将重新执行子查询。您使用的是哪个版本的MySQL?简单而有效的解决方案是将其变为JOIN
。
SELECT t.*
FROM traffic AS t
JOIN redirect AS r USING(shortcode)
WHERE campaign = '385'
AND pubid = '35'
GROUP BY ip
您还需要INDEX(campaign, pubid, shortcode)
。
有一个" bug"在任一查询中 - 您要求所有列,但仅按ip
分组。如果其余列并非真正依赖ip
。