V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qwerthhusn
V2EX  ›  程序员

同样的一个 UPDATE JOIN, SQL Server 和 MySQL 的差距巨大。数据库调优达人进来分析下!

  •  1
     
  •   qwerthhusn · 2021-11-11 20:47:34 +08:00 · 662 次点击
    这是一个创建于 868 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先是建表语句,有两张表,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 运行的,默认配置没有任何修改。

    SmiteChow
        1
    SmiteChow  
       2021-11-12 10:23:48 +08:00
    sql 语句都不一样啊
    qwerthhusn
        2
    qwerthhusn  
    OP
       2021-11-12 10:57:08 +08:00
    @SmiteChow 一样的,只是两个 DBMS 的 SQL 语法不一样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1186 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:26 · PVG 02:26 · LAX 11:26 · JFK 14:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.