跨多SQL表关联查询B2表收发方对应alias的高效方案咨询
最优查询实现方案
1. 标准查询语句
该场景下关联逻辑不可避免,以下写法已经是逻辑最简的实现,执行效率不存在冗余损耗:
SELECT c1.alias AS sender_alias, c2.alias AS receiver_alias FROM B2 INNER JOIN B1 b1_s ON B2.sender = b1_s.id INNER JOIN clients c1 ON b1_s.client = c1.id INNER JOIN B1 b1_r ON B2.receiver = b1_r.id INNER JOIN clients c2 ON b1_r.client = c2.id -- 替换为实际要查询的B2行ID WHERE B2.id = 'target_b2_row_id';
很多ORM框架中支持的
sender.client.alias链式调用,本质上也是自动生成了上述关联逻辑,底层执行效率和手写SQL完全一致,不存在额外性能优势。
2. 性能达标核心配置(时延<1ms的关键)
所有关联均为主键/唯一键等值匹配,只要配置对应覆盖索引,完全可以达到性能要求:
- 三个表的id字段均为主键,自带唯一索引,单行查询本身为O(1)复杂度
- 新增B1表覆盖索引,避免回表查询client字段:
CREATE UNIQUE INDEX idx_b1_id_cover_client ON B1(id) INCLUDE (client);
- 新增clients表覆盖索引,避免回表查询alias字段:
CREATE UNIQUE INDEX idx_clients_id_cover_alias ON clients(id) INCLUDE (alias);
以上配置下,单次查询仅需要4次索引查找,无额外回表IO,热数据场景下时延稳定低于1ms。
3. 极致优化方案(可选)
如果该查询QPS极高,且clients的alias字段更新频率极低,可以选择冗余存储优化:
-- B2表新增冗余字段 ALTER TABLE B2 ADD COLUMN sender_alias VARCHAR(16), ADD COLUMN receiver_alias VARCHAR(16);
写入B2数据时直接预写入两个alias的值,查询时仅需单行查询:
SELECT sender_alias, receiver_alias FROM B2 WHERE id = 'target_b2_row_id';
该方案仅需要1次索引查找,时延可低至0.1ms级别,仅需要额外保障冗余字段的一致性即可。
内容的提问来源于stack exchange,提问作者ASML
相关产品推荐
相关产品推荐

