我有一张这样的桌子
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;
此表包含19 000 00行。
我需要选择与其他id_ur
共享window_key
字段的所有记录。
例如,如果我有如下记录:
id,id_ur,window_key
1,"123","ABC"
2,"124","DEF"
3,"123","ABD"
4,"124","DEF"
我需要返回“ 123”,而不是“ 124”。
我正在寻找一种高性能的方式来在MySQL Community Server版本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;
但这并不是真正的表现。 我试图使用group by子句来表达它,但是我不知道如何表达在特定列上没有区别的行的分组。
我在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
所以最快的解决方案是分组人数不同的分组方式。
答案 0 :(得分:2)
@FatemehNB 的答案很好。除此之外,您还可以尝试以下查询并比较性能:
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
答案 1 :(得分:2)
同时使用group by
和having
:
select id_user
from items
group by id_user
having count(distinct window_key) > 1