首先是建表语句,有两张表,MySQL 和 SQL Server 一模一样。
create table small_table(
id bigint not null primary key,
varchar_1 varchar(255),varchar_2 varchar(255),varchar_3 varchar(255),varchar_4 varchar(255),varchar_5 varchar(255),
datetime_1 datetime,datetime_2 datetime,datetime_3 datetime,
connect_column varchar(255),
datetime_4 datetime,datetime_5 datetime,
int_1 int,int_2 int,int_3 int,int_4 int,int_5 int
);
create table big_table(
id bigint not null primary key,
varchar_1 varchar(255),varchar_2 varchar(255),varchar_3 varchar(255),varchar_4 varchar(255),varchar_5 varchar(255),
datetime_1 datetime,datetime_2 datetime,datetime_3 datetime,
connect_column varchar(255),
datetime_4 datetime,datetime_5 datetime,
int_1 int,int_2 int,int_3 int,int_4 int,int_5 int,
copy_1 varchar(255), copy_2 datetime, copy_3 int
);
small_table 有 7000 条数据,id 从 0 到 6999 ,所有字段都是随机值充数的,除了 connect_column ,这个字段取了七千个不重复的字符串。 big_table 有 50 万条数据,id 从 0 到 499999 ,所有字段都是随机值充数的,除了 connect_column ,这个字段和上面一样,七千个值随机分布到 50 万条数据里面。
现在对着 MySQL 执行,直接卡住,几分钟也不会返回。
update big_table bt
inner join small_table st on bt.connect_column = st.connect_column
set bt.copy_1 = st.varchar_1,
bt.copy_2 = st.datetime_1,
bt.copy_3 = st.int_1
where bt.id >= -1;
现在对着 SQL Server 执行,5 秒左右直接结束
update bt
set bt.copy_1 = st.int_1,
bt.copy_2 = st.datetime_1,
bt.copy_3 = st.int_1
from big_table bt
inner join small_table st on bt.connect_column = st.connect_column;
我想知道是什么原因导致了这种巨大的差距??? 我 MySQL 用的是 8 ,SQL Server 用的是 2017.。。 两个都是通过 docker desktop 运行的,默认配置没有任何修改。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.