当前位置: 首页 > news >正文

mysql复合条件匹配的查询优化

对于查找所有 r = 'r1' 的关系,并且同时存在一个 r = 'r2' 的关系,如果写出如下语句,查询速度非常慢,即使对r, h, t, h_table, t_table 都加了索引:

SELECT id FROM `关系` r1
WHERE r1.r = 'r1'AND EXISTS (SELECT 1 FROM `关系` r2WHERE r1.h = r2.hAND r1.t = r2.tAND r1.h_table = r2.h_tableAND r1.t_table = r2.t_tableAND r2.r = 'r2');

原因有以下两种:

1、mysql在执行多字段联合查询时,无法有效利用这些单列索引进行快速查找

2、EXISTS 是一种“半连接”操作,通常效率不如显式的 JOIN,尤其是在大表中做多次子查询时,性能会显著下降。

优化措施:

1、添加组合索引:

ALTER TABLE `关系` ADD INDEX idx_h_t_tables_r (h, t, h_table, t_table, r);

如果报specified key was too long; max length is 3072 bytes,可以使用前缀索引,具体如下

ALTER TABLE `关系` ADD INDEX idx_h_t_tables_r (h(100), t(100), 
h_table(100), t_table(100), r(100));

 2、改写为 JOIN 查询

SELECT DISTINCT r1.id
FROM `关系` r1
JOIN `关系` r2ON r1.h = r2.hAND r1.t = r2.tAND r1.h_table = r2.h_tableAND r1.t_table = r2.t_table
WHERE r1.r = 'r1'AND r2.r = 'r2';

http://www.lryc.cn/news/586686.html

相关文章:

  • jeepay开源项目开发中金支付如何像其他支付渠道对接那样简单集成,集成服务商模式,极简集成工具。
  • (dp、贪心)洛谷 P8179 Tyres 题解
  • 012_PDF处理与文档分析
  • hash表的模拟--开放定址法
  • AI 助力:如何批量提取 Word 表格字段并导出至 Excel
  • 学习C++、QT---23(QT中QFileDialog库实现文件选择框打开、保存讲解)
  • 行测速算之假设分配法
  • 在 JetBrains 系列 IDE(如 IntelliJ IDEA、PyCharm 等)中如何新建一个 PlantUML 文件
  • Java集合框架深度解析:LinkedList vs ArrayList 的对决
  • 【Linux | 网络】应用层(HTTP)
  • Linux|服务器|二进制部署nacos(不是集群,单实例)(2025了,不允许还有人不会部署nacos)
  • 【PTA数据结构 | C语言版】简单计算器
  • 【Linux】线程机制深度实践:创建、等待、互斥与同步
  • 详解Linux下多进程与多线程通信(二)
  • ARC 02 runner scale set chart:对接集群与 Github Action 服务器
  • linux上的软挂载操作方法
  • DAY02:【ML 第一弹】KNN算法
  • 分类问题-机器学习
  • 掌握系统设计的精髓:12个核心设计模式的通俗解读
  • NW756NW815美光固态闪存NW821NW828
  • 设计模式深度解析:单例、工厂、适配器与代理模式
  • 【leetcode】字符串,链表的进位加法与乘法
  • 5G NR PDCCH之处理流程
  • Web攻防-PHP反序列化原生内置类Exception类SoapClient类SimpleXMLElement
  • 预处理器完整功能介绍和示例演示(LESS/SCSS)
  • MYSQL笔记1
  • RabbitMQ队列的选择
  • 微信小程序案例 - 本地生活(首页)
  • CCS-MSPM0G3507-6-模块篇-OLED的移植
  • 什么时候需要用到 multiprocessing?