MySql 查询性能优化必知必会 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ProgrammerAlan
V2EX    程序员

MySql 查询性能优化必知必会

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

作为一个写业务代码的 "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 我在 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     Solana     873 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 24ms UTC 20:29 PVG 04:29 LAX 12:29 JFK 15:29
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86