
作为一个写业务代码的 "JAVA CURD BOY" ,具备写出高效率 SQL 让应用高性能访问数据库的能力非常重要。获得这个能力的过程我收获了点知识和经验,今天在这里分享出来,希望大家多多交流指点。
本文内容主要包括以下几个方面:分析查询 SQL ,MySQL 查询优化器、数据库存储结构、索引,索引维护,索引设计,SQL 优化,表结构设计,分库分表,查询功能架构设计。
1 dqzcwxb 2023-02-09 11:51:16 +08:00 感谢,已经当上世界首富 |
2 lookStupiToForce 2023-02-09 12:05:23 +08:00 挺好,写条目挺全,适合找不到问题时拉清单一条一条处理或者查漏补缺 |
3 Macv1994 2023-02-09 12:47:35 +08:00 感谢 |
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; 跑了很久也没出结果 |
5 ProgrammerAlan OP @ccagml 驱动表的数据太大了,得想办法把数据分割才行吧。 |
6 ProgrammerAlan OP @ProgrammerAlan 没有其他过滤条件缩小范围吗? |
7 xuanbg 2023-02-09 14:23:00 +08:00 |
8 ccagml 2023-02-09 20:02:25 +08:00 |
10 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 (没用过) 数据放内存,磁盘做灾备。 |
11 ccagml 2023-02-10 08:07:21 +08:00 via Android @Jarvie789 简单主键查询还是挺快的,a,b 已经是水平分表其中的两张表,没有需求不好在搞继续分表这种大操作 |
12 SkyLine7 2023-02-10 16:34:39 +08:00 好 |