看到有人发 MySql 必知必会,想请教一个问题

2023-02-09 12:59:50 +08:00
 ccagml

机器环境

表结构

CREATE TABLE `a` (
`id` varchar(30) NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `b` (
`id` varchar(30) NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

想要做的

我尝试过

SELECT a.id FROM a INNER join b on a.id = b.id;

id 是字符串好像也没办法写代码做类似以下操作?

请问还有什么办法可以查询出两个表有交集的部分的数据吗

3720 次点击
所在节点    MySQL
37 条回复
uiosun
2023-02-09 13:09:14 +08:00
必须要一句 SQL 搞定吗?一句话搞定的话,感觉超难……
lovelylain
2023-02-09 13:09:47 +08:00
字符串也可以排序比较大小的,你这里是主键,也不用考虑重复和索引问题,按你那个 id > xxx limit 做就行。
foolishcrab
2023-02-09 13:10:23 +08:00
Sql server 试试 interset, mysql 全拿出来在内存里算吧还是
ccagml
2023-02-09 13:12:20 +08:00
@uiosun 不必须一句话呀,也可以写程序,按 2 楼的说话可以比较大小,我之前以为不行
ccagml
2023-02-09 13:12:39 +08:00
@jobmailcn 这样嘛,谢谢大佬
ccagml
2023-02-09 13:15:08 +08:00
@moqizhengz 没权限换数据库😂, MySQl 怎么做也不清楚,就是 io 满了,也没有加配置的空间
xsonglive491
2023-02-09 13:58:45 +08:00
你应该先 explain 下你的查询语句看是什么问题
thinkershare
2023-02-09 14:05:08 +08:00
没啥原因,MySQL 数据库过亿了就是慢。直接用子程序算了。先分别独立查询,看看独立查询费事多久。你这个过滤后大概会命中多少数据嘛?另外就像楼上说的,先 explain 一下,看看命中的索引信息。字符串肯定一样可以比较大小,为啥会不能比较大小呢?另外看看你字符串上使用的 collate 信息。
LeegoYih
2023-02-09 14:15:37 +08:00
求交集有过滤条件吗?如果有过滤条件且数量少直接 join 是没问题的。
如果是全量匹配,那只用代码一批一批查,没办法做到实时。
liprais
2023-02-09 14:18:14 +08:00
取出来之后要干啥?
要是只要其中一张表的数据可以用 exists
opengps
2023-02-09 14:40:38 +08:00
首先,硬盘慢。你用的云服务器,自带的硬盘,这个硬盘是虚拟化之后的,本身 io 就严重打折。
其次,索引大。你的 id 本身 30 字节,结合 1 亿,8000 万,这意味着这两个主键索引就得 54 亿字节(约 3GB )

结论是:可以考虑下,分别把两个 id 拷贝到 2 个内存表,然后对两个内存表进行 INNER join 。看看效率提升多少
opengps
2023-02-09 14:43:21 +08:00
@opengps #11 少说了一句,注意下你的 16G 内存剩下多少空闲,需要至少大于 3G
starrys
2023-02-09 15:23:24 +08:00
观察一下两表的 id 的分布规律,分割成 10~50 次查询,再将结果 union 起来。
weidaizi
2023-02-09 16:30:17 +08:00
别用数据库来做这种偏计算类的工作,用个 python 查一下两张表的 id 字段回来,在程序里做对比就好了
ccagml
2023-02-09 16:52:22 +08:00
@xsonglive491 大佬 explain 加了
@thinkershare 以为字符串比较 会 出现 "2" > "11" 这种, id 长度不一样长
ccagml
2023-02-09 16:52:40 +08:00
@LeegoYih 全量匹配
ccagml
2023-02-09 16:57:36 +08:00
@liprais 主键冲突,需要捞出数据看哪条是对的,两个表除了主键,其他内容都不一样
liprais
2023-02-09 16:58:14 +08:00
@ccagml 忍着吧,mysql 就这性能
ccagml
2023-02-09 17:00:22 +08:00
@starrys id 没有规律,可长可短,自定义的
ccagml
2023-02-09 17:03:42 +08:00
@weidaizi 确实,本来觉得主键连主键,还只要查主键,应该会很快

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/914546

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX