按差异筛选的性能组

r6hnlfcb  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(326)

我有一张这样的table

CREATE TABLE "items" (
  "id" int(11) NOT NULL AUTO_INCREMENT,
  "id_ur" varchar(255) NOT NULL,
  "window_key" varchar(255) DEFAULT NULL,
  PRIMARY KEY ("id"),
  KEY "idx_window_key" ("window_key") USING BTREE,
  KEY "idx_id_ur" ("id_ur") USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

此表包含190000行。
我需要选择所有共享 id_ur 字段具有不同的 window_key . 例如,如果我有如下记录:

id,id_ur,window_key
1,"123","ABC"
2,"124","DEF"
3,"123","ABD"
4,"124","DEF"

我需要返回“123”,而不是“124”。
我正在寻找一种在mysql社区服务器5.7.22版中实现这一点的有效方法。
我尝试了以下方法:

select c1.id_ur
from items c1
inner join items c2
on c1.id_ur = c2.id_ur
where c1.window_key <> c2.window_key;

但这并不是真正的表演。我试着用GROUPBY子句来表示它,但是我不知道如何表示特定列上没有差异的行分组。
两个都有索引 id_ur 以及 window_key 领域。我不确定在这两个字段上添加索引是否有用。
我在找一个合适的查询来获取这些记录。
多亏了别人的帮助,我才找到了更有效的解决办法。
这是基准的结果:

select distinct c1.id_ur
from item c1, item c2
where c1.id_ur = c2.id_ur
and c1.window_key <> c2.window_key
-- 1483 secs

select c1.id_ur
from item c1
inner item c2
on c1.id_ur = c2.id_ur
where c1.window_key <> c2.window_key;
 -- 675 secs

select distinct c1.id_ur
from item c1
group by c1.id_ur
having count(distinct c1.window_key) > 1
-- 170 secs

SELECT dt.id_ur 
FROM 
(
  SELECT DISTINCT c1.id_ur, c1.window_key 
  FROM gbmlive.canonical AS c1
) AS dt 
GROUP BY dt.id_ur 
HAVING COUNT(*) > 1
-- 376 secs

所以最快的解决方案是一个有明显计数的分组。

k4emjkb1

k4emjkb11#

@法蒂门布的回答很好。除此之外,您还可以尝试以下查询和性能比较:

SELECT dt.id_ur 
FROM 
(
  SELECT DISTINCT c1.id_ur, c1.window_key 
  FROM items AS c1
) AS dt 
GROUP BY dt.id_ur 
HAVING COUNT(*) > 1
weylhg0b

weylhg0b2#

使用 group by 以及 having 同时:

select id_user
from items
group by id_user
having count(distinct window_key) > 1

相关问题