MySql 查询性能优化必知必会

2023-02-09 11:46:36 +08:00
 ProgrammerAlan

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

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

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

1958 次点击
所在节点    程序员
12 条回复
dqzcwxb
2023-02-09 11:51:16 +08:00
感谢,已经当上世界首富
lookStupiToForce
2023-02-09 12:05:23 +08:00
挺好,写条目挺全,适合找不到问题时拉清单一条一条处理或者查漏补缺
Macv1994
2023-02-09 12:47:35 +08:00
感谢
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
2023-02-09 14:16:47 +08:00
@ccagml 驱动表的数据太大了,得想办法把数据分割才行吧。
ProgrammerAlan
2023-02-09 14:17:55 +08:00
@ProgrammerAlan 没有其他过滤条件缩小范围吗?
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
2023-02-09 20:02:25 +08:00
@ProgrammerAlan 没有过滤条件
@xuanbg 我在 https://www.v2ex.com/t/914546 这里发了个讨论
ccagml
2023-02-09 20:03:36 +08:00
@xuanbg 看 explain 感觉是会自动优化数据少的驱动吧
Jarvie789
2023-02-09 20:51:15 +08:00
@ccagml 驱动表太大,1 亿行数据大概 5G 。简单查询都受不了,`select id from a where id = 8020000;` 我认为
穷人方案:做水平数据分表,a 表 500 万一个表,分 20 个表 b 表同理,a 、b 表 hash 分区 num 20 个。执行 20 次查询。。
富人方案:换上 1T 内存,试试 ignite (没用过) 数据放内存,磁盘做灾备。
ccagml
2023-02-10 08:07:21 +08:00
@Jarvie789 简单主键查询还是挺快的,a,b 已经是水平分表其中的两张表,没有需求不好在搞继续分表这种大操作
SkyLine7
2023-02-10 16:34:39 +08:00

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

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

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

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

© 2021 V2EX