作为一个写业务代码的 "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 1
@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
好
|