尝试使用 LEFT OUTER JOIN 优化 MySQL 查询

2024-01-26

我有这个查询,它工作正常,只是需要很长时间(7 秒,jobs 表中有 40k 条记录,wq 表中有 700k 条记录)。

我尝试了 EXPLAIN,它说它查看作业表中的所有记录,并且不使用任何索引。

我不知道如何告诉 MySQL 在查找 wq 表之前应该使用 jobs.status 字段来过滤记录。

其目的是获取状态为 != 331 的作业以及 wq 状态为 (101, 111, 151) 的任何其他作业的所有记录。

Query:

SELECT jobs.*
FROM jobs
LEFT OUTER JOIN wq ON (wq.job = jobs.id AND jobs.status IN (341, 331) AND wq.status IN (101, 111, 151))
WHERE ((wq.info is not NULL) or (jobs.status != 331 and ack = 0))

解释输出:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  jobs    ALL     ack,status,status_ack   NULL    NULL    NULL    38111   Using filesort
1   SIMPLE  wq  ref     PRIMARY,job,status  PRIMARY     4   cts.jobs.id     20  Using where

表定义:

CREATE TABLE jobs ( id int(10) NOT NULL AUTO_INCREMENT,
comment varchar(100) NOT NULL DEFAULT '',
profile varchar(60) NOT NULL DEFAULT '',
start_at int(10) NOT NULL DEFAULT '0',
data text NOT NULL,
status int(10) NOT NULL DEFAULT '0',
info varchar(200) NOT NULL DEFAULT '',
finish int(10) NOT NULL DEFAULT '0',
priority int(5) NOT NULL DEFAULT '0',
ack tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (id),
KEY start_at (start_at),
KEY status (status),
KEY status_ack (status,
ack) ) ENGINE=MyISAM AUTO_INCREMENT=2037530 DEFAULT CHARSET=latin1;


CREATE TABLE wq ( job int(10) NOT NULL DEFAULT '0',
process varchar(60) NOT NULL DEFAULT '',
step varchar(60) NOT NULL DEFAULT '',
status int(10) NOT NULL DEFAULT '0',
run_at int(10) NOT NULL DEFAULT '0',
original_run_at int(10) NOT NULL DEFAULT '0',
info varchar(200) NOT NULL DEFAULT '',
pos int(10) NOT NULL DEFAULT '0',
changed_at int(10) NOT NULL DEFAULT '0',
file varchar(60) NOT NULL DEFAULT '',
PRIMARY KEY (job,
process,
step,
file),
KEY job (job),
KEY status (status) ) ENGINE=MyISAM DEFAULT CHARSET=latin1

不幸的是 mysql(也许还有任何 dbms)无法优化像这样的表达式jobs.status != 331 and ack = 0因为 B 树不是一种可以快速查找任何不等于常量值的结构。因此,您将始终获得全面扫描。

如果有一些更好的条件,比如jobs.status = 331 and ack = 0(注意我已经改变了!= to =)那么建议加快此查询:

  1. 将查询拆分为 2 个,并连接UNION ALL
  2. 在一个查询中替换LEFT JOIN to INNER JOIN(其中暗示wq.info is not NULL)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试使用 LEFT OUTER JOIN 优化 MySQL 查询 的相关文章

  • 是否可以将新表和旧表从触发器传递到 MySQL 中的过程中?

    是否可以将新表和旧表从触发器传递到 MySQL 中的过程中 我怀疑不会 因为没有过程接受的表这样的数据类型 有什么可能的解决方法吗 理想情况下它看起来像这样 CREATE TRIGGER Product log AFTER UPDATE O
  • 将 MySQL 结果作为 PHP 数组

    mysql 表 config name config value allow autologin 1 allow md5 0 当前的 php 代码 sth mysql query SELECT rows array while r mysq
  • 尝试在 React 应用程序中连接到 MySQL 数据库时,无法读取未定义的属性(读取“查询”)错误

    我正在尝试连接到 MySQL 数据库并在单击按钮后在 React 应用程序中运行查询 一些它如何给出错误 我当前的代码如下所示 import mysql from mysql function App async function sync
  • 一个表可以有多个主键吗?

    我现在很困惑 也许你可以帮助我更好地理解这个问题 即一个表可以有两个主键 如果是 那么如何 如果没有 那为什么 您询问是否可以有多个主键field你当然可以 您只能有一个主键 但它可以包含唯一标识行所需的任意数量的列 创建表时使用类似这样的
  • 何时在 mysql 中使用 Union [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于 Union 您会在什么现实情况下使用它 因为对我来说 对具有不同列用途 含义的两个表中的两个选择查询使用联合是没有意义的 例如
  • 无法连接到 Node.js 上的 MySQL 数据库

    我仍然不明白为什么在尝试连接到 Node js 上的 MYSQL Server 时仍然收到此错误消息 ERROR Error ER ACCESS DENIED ERROR Access denied for user root localh
  • PHP使用auto_increment生成短唯一ID?

    我想生成一个简短的 唯一的 ID 而不必检查冲突 我目前正在做类似的事情 但是我当前生成的 ID 是随机的 并且在循环中检查冲突很烦人 并且如果记录数量显着增加 将会变得昂贵 通常担心冲突不是问题 但我想要生成的唯一 ID 是一个由 5 8
  • 无法在 .net core 2 中从 MySQL 构建“日期”类型列

    我已经开始了一个新的 net core 2 项目 我正在尝试将 MySQL 数据库导入实体框架 我使用此命令来搭建数据库 Scaffold DbContext server localhost port 3306 user id user
  • 猪的组连接等效吗?

    试图在 Pig 上完成这个任务 寻找 MySQL 的 group concat 等效项 例如 在我的表中 我有以下内容 3fields userid clickcount pagenumber 155 2 12 155 3 133 155
  • MySQL - 多个结果集

    我正在使用 NET Connector 连接到 MySQL 在我的应用程序中 很少有线程使用相同的连接 因此如果 MySQLDataReader 尚未关闭并且某个线程正在尝试执行查询 则会出现该错误 已经有一个打开的 DataReader
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • meta_query,如何使用关系 OR 和 AND 进行搜索?

    已解决 请参阅下面的答案 我有一个名为的自定义帖子类型BOOKS 它有几个自定义字段 名称为 TITLE AUTHOR GENRE RATING 我该如何修复我的meta query下面的代码以便仅books在自定义字段中包含搜索词 tit
  • MVCC 如何与 MySql 中的 Lock 配合使用?

    我知道Mysql中使用锁或者MVCC可以实现并发控制 比如可重复读 但我不知道MVCC如何避免幻读 在其他地方了解到一般是通过MVCC和Gap Lock来实现的 但是目前我理解的是MVCC不需要锁 即更新和删除都是使用undo log来实现
  • MySQL正则表达式:如何将字符串中的数字与\d匹配?

    我有一个专栏release date它以字符串格式存储日期 不是 DATETIME 格式 因为它们有时可以是任何其他字符串文字 我想根据给定的月份和年份查找任意日期的所有记录 尝试遵循但对我不起作用 gt Post find all con
  • MySQL - 从数字列表中选择在表的 id 字段中没有对应项的数字

    我有一个数字列表 例如 2 4 5 6 7 我有一个表 foos 带有 foos ID 包括 1 2 3 4 8 9 我想获取我的号码列表 并在我的表的 ID 字段中找到那些没有对应项的号码 实现此目的的一种方法是创建一个表格栏 在 ID
  • Dapper 或 MySql 未找到包含句号“.”的存储过程。

    我有一个简单的 C 控制台 它使用 Dapper ORM 调用本地 MySql 数据库 以执行名为的存储过程users UserCreate 但是 当运行查询时 我收到一个异常 在数据库 用户 中找不到过程或函数 UserCreate Bu
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • 无法连接到 MAMP 上的 phpMyAdmin

    我收到此错误消息 MySQL 说道 无法连接 设置无效 phpMyAdmin 尝试连接 MySQL 服务器 但服务器拒绝连接 您应该检查配置中的主机 用户名和密码 并确保它们与 MySQL 服务器管理员提供的信息相对应 用户和通行证是默认的
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User

随机推荐

  • 如何从Word 2010 Addin(用C#开发)获取“KeyPress”事件?

    如何从用 C 开发的 Word 2010 Addin 捕获 KeyPress 事件 注意 我不是在寻找 复杂 的解决方案 例如挂钩之类的东西 而是在寻找漂亮整洁的解决方案 NET 甚至来自对象模型 我 手中 的应用程序对象是 Microso
  • Angular 2在路由时传递对象

    我试图在路由时在页面之间传递对象 数组 为此我做了什么这个答案 https stackoverflow com questions 35478994 angular 2 passing object via route params pos
  • 如何为 lm() 设置平衡单向方差分析

    我有数据 dat lt data frame NS c 8 56 8 47 6 39 9 26 7 98 6 84 9 2 7 5 EXSM c 7 39 8 64 8 54 5 37 9 21 7 8 8 2 8 Less 5 c 5 9
  • getRootPane() 默认按钮 - 这是一个错误吗?

    我做了一个SSCE 请注意 它必须是 Windows 外观和感觉 import java awt import javax swing public class DefaultButtonBug private static final S
  • tbl_df 被转换为 S4 类中的列表

    当我尝试使用时tbl df在中四班 tbl df插槽似乎转变为list library tibble setOldClass c tbl df tbl data frame setClass Class TestClass slots c
  • 转置和扩展数据

    我的熊猫数据框如下所示 Country Code 1960 1961 1962 1963 1964 1965 1966 1967 1968 2015 ABW 2 615300 2 734390 2 678430 2 929920 2 963
  • FFmpeg 的 avcodec_decode_audio3 返回 -1

    我在android上使用FFmpeg来解码mp3 我在配置中设置了所有解码器启用并正确制作了 so 文件 这是为配置文件添加参数的 sh NDK android ndk r5b PLATFORM NDK platforms android
  • 如何最小化 R 包的安装大小

    在我的工作场所 我们正在为不同版本的 R 安装许多库 所需的大小正在迅速增加 我可以做什么来尽可能减少每次安装 我知道 no docs 并且我需要 with keep source EDIT 这是对我的设置的快速研究 我将我的图书馆复制到
  • 详细了解 openCV aruco 标记检测/姿态估计:亚像素精度

    我目前正在研究openCV的 aruco 模块 特别关注ArUco标记和AprilTags的poseEstimation 在研究子像素精度时 我遇到了一种奇怪的行为 如下代码所示 如果我确实提供了 完美 校准 例如 cx cy 等于图像中心
  • 在外部登录/注册 ASP.NET Web API 2.0 和 Identity 期间从 Facebook 检索其他配置文件信息

    似乎有很多关于如何使用 ASP NET Identity 和 MVC 客户端从 Facebook 配置文件获取附加信息的文档 但我似乎找不到任何关于如何从 Web API 控制器访问附加信息声明的信息 我的 Startup Auth cs
  • 为什么在 forEach 循环中不会追加列表项?

    我有一个简单的 forEach 循环 其中我尝试将列表项附加到无序列表中 但是 当我运行脚本时 我只看到添加了一个列表项 谁能解释为什么会发生这种情况 JS let bookElement document getElementsByCla
  • 如何在C#中使用文本框搜索列表视图的项目

    我有一个列表视图名称listView1 它包含计算机ID和它们的一些信息 所以我想做的是我有一个文本框名称过滤框 当我写东西时它会过滤它 它工作得很好 我的问题是它只是寻找第一列不是其他列 例如 PCNAME USER MODEL AAAA
  • 知道类中的所有变量是否为空的最佳方法是什么?

    这意味着类已初始化 但变量尚未设置 示例类 public class User String id null String name null public String getId return id public void setId
  • Groovy 不在集合中

    在 Groovy 中检查列表是否包含某些内容的惯用方法是使用in if b in a b c 但是如何很好地检查某些内容是否不在集合中呢 if g in a b c 使用逻辑看起来并不混乱 不经意的一瞥是隐藏的 在 Groovy 中是否有更
  • 如何从 ion-searchbar 获取输入?

    这是超级简单的问题 但我似乎无法弄清楚这一点 是的 我已经阅读了文档 我正在尝试获取用户输入的内容ion searchbar 在 Ionic v4 中 在他们按搜索并放入 const let 后 麻哈HTML
  • 带有 std::thread 和 std::chrono 的基本计时器

    我正在尝试使用经典方法来实现一个基本计时器 start 和 stop 我将 c 11 与 std thread 和 std chrono 一起使用 启动方法 创建一个在给定间隔时间内休眠的新线程 然后执行给定的 std function 当
  • 设置 UIView 的背景颜色会增加内存使用量

    我正在将许多 UIView 加载到 UIScrollView 上 并试图找出它们使用这么多内存的原因 经过使用 Instruments 的排除过程后 我发现设置视图的背景颜色会增加 4 倍的内存使用量 如果我不设置背景颜色 内存使用量约为
  • 上传到firebase时如何防止重复图像?

    当我想将图像上传到 firebase 实时数据库和存储 时遇到一些问题 在实时数据库中 我的图像对象默认有一张图像 并且当我上传其他图像时我不想覆盖图像所以我使用了传播运算符 SO 当我选择时一张图片并单击上传它们 它可以工作并保存 没有重
  • 更新列表列表中的属性

    问题是 如何在不循环的情况下更新 allItems 内的 ItemCount 字段 例如使用 Linq 例如 如果 Index 0 我想将 ItemCount 设置为 ItemCount 5 您可以看到下面的代码 我有以下课程 public
  • 尝试使用 LEFT OUTER JOIN 优化 MySQL 查询

    我有这个查询 它工作正常 只是需要很长时间 7 秒 jobs 表中有 40k 条记录 wq 表中有 700k 条记录 我尝试了 EXPLAIN 它说它查看作业表中的所有记录 并且不使用任何索引 我不知道如何告诉 MySQL 在查找 wq 表