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

MySql 查询性能优化必知必会

  •  
  •   ProgrammerAlan · 2023-02-09 11:46:36 +08:00 · 1977 次点击
    这是一个创建于 657 天前的主题,其中的信息可能已经有所发展或是发生改变。

    作为一个写业务代码的 "JAVA CURD BOY" ,具备写出高效率 SQL 让应用高性能访问数据库的能力非常重要。获得这个能力的过程我收获了点知识和经验,今天在这里分享出来,希望大家多多交流指点。

    本文内容主要包括以下几个方面:分析查询 SQL ,MySQL 查询优化器、数据库存储结构、索引,索引维护,索引设计,SQL 优化,表结构设计,分库分表,查询功能架构设计。

    全文链接: https://mp.weixin.qq.com/s/XpE3evFGKwdluFd3Na1m_Q

    12 条回复    2023-02-10 16:34:39 +08:00
    dqzcwxb
        1
    dqzcwxb  
       2023-02-09 11:51:16 +08:00
    感谢,已经当上世界首富
    lookStupiToForce
        2
    lookStupiToForce  
       2023-02-09 12:05:23 +08:00
    挺好,写条目挺全,适合找不到问题时拉清单一条一条处理或者查漏补缺
    Macv1994
        3
    Macv1994  
       2023-02-09 12:47:35 +08:00
    感谢
    ccagml
        4
    ccagml  
       2023-02-09 12:50:09 +08:00
    写的很详细
    我有两张结构一样的表结构
    ```
    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;
    ```
    a 表有 1 亿数据
    b 表有 8000W 数据
    里面有很少部分的主键 id 值是一样的
    请问有什么办法查询他们之前是否有相同 id 的记录呢?
    我尝试过
    SELECT a.id FROM a INNER join b on a.id = b.id;
    跑了很久也没出结果
    ProgrammerAlan
        5
    ProgrammerAlan  
    OP
       2023-02-09 14:16:47 +08:00
    @ccagml 驱动表的数据太大了,得想办法把数据分割才行吧。
    ProgrammerAlan
        6
    ProgrammerAlan  
    OP
       2023-02-09 14:17:55 +08:00
    @ProgrammerAlan 没有其他过滤条件缩小范围吗?
    xuanbg
        7
    xuanbg  
       2023-02-09 14:23:00 +08:00
    A 表是全表扫描,1 亿数据 MySQL 跑不出来也是正常的。假设能跑得出来,反过来写成:SELECT b.id FROM b INNER join a on a.id = b.id;都会快不少。因为 B 表只有 8000 万。。。所以,以 B 表为驱动表,分成 80 批,每批跑 100 万就很快能跑出来了。 @ccagml
    ccagml
        8
    ccagml  
       2023-02-09 20:02:25 +08:00
    @ProgrammerAlan 没有过滤条件
    @xuanbg 我在 https://www.v2ex.com/t/914546 这里发了个讨论
    ccagml
        9
    ccagml  
       2023-02-09 20:03:36 +08:00
    @xuanbg 看 explain 感觉是会自动优化数据少的驱动吧
    Jarvie789
        10
    Jarvie789  
       2023-02-09 20:51:15 +08:00   ❤️ 1
    @ccagml 驱动表太大,1 亿行数据大概 5G 。简单查询都受不了,`select id from a where id = 8020000;` 我认为
    穷人方案:做水平数据分表,a 表 500 万一个表,分 20 个表 b 表同理,a 、b 表 hash 分区 num 20 个。执行 20 次查询。。
    富人方案:换上 1T 内存,试试 ignite (没用过) 数据放内存,磁盘做灾备。
    ccagml
        11
    ccagml  
       2023-02-10 08:07:21 +08:00 via Android
    @Jarvie789 简单主键查询还是挺快的,a,b 已经是水平分表其中的两张表,没有需求不好在搞继续分表这种大操作
    SkyLine7
        12
    SkyLine7  
       2023-02-10 16:34:39 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4222 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:27 · PVG 13:27 · LAX 21:27 · JFK 00:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.