为什么这个简单的连接查询使用子查询会明显更快?

2024-03-17

我有两张桌子。order_details这是 100,000 行,并且outbound即 10,000 行。

我需要加入他们的专栏order_number,两者都是 VARCHAR(50)。 order_number 在出站表中不唯一。

CREATE TABLE `outbound` (
    `outbound_id` int(12) NOT NULL,
    `order_number` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `order_details` (
    `order_details_id` int(12) NOT NULL,
    `order_number` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是我的初始查询,运行时间远远超过 60 秒:

SELECT o.order_number
FROM outbound o
INNER JOIN order_details od
    ON o.order_number = od.order_number

此查询获得相同的结果,并且运行时间不到一秒:

SELECT o.order_number
FROM outbound o
INNER JOIN
(
    SELECT order_number
    FROM order_details
) od
ON (o.order_number = od.order_number)

这让我感到惊讶,因为通常子查询要慢得多。

Running EXPLAIN(我仍在学习如何理解)表明子查询版本使用derived2表,它正在使用索引,并且该索引是auto_key0。我不够精明,不知道如何解释这一点,以理解为什么这会产生重大影响。

我正在通过命令行运行这些查询。

我正在运行 MySQL Ver 14.14 Distrib 5.6.35,适用于 Linux (x86_64) CentOS。

总之:

为什么这个简单的连接查询使用子查询会明显更快?


我对 MySQL 的了解非常有限。但这些是我的想法:

您的表没有索引。 然后,连接必须读取整个第二个表才能比较第一个表的每一行。

子查询读取第二个表一次并创建索引,然后它不需要为第一个表的每一行读取整个第二个表。它只需要检查索引,这要快得多。

要验证我是否正确,请尝试在两个表中为 order_number 列创建索引(CREATE INDEX ...),然后再次运行这两个查询。您的第一个查询应该只需要不到一秒而不是一分钟。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个简单的连接查询使用子查询会明显更快? 的相关文章

  • 仅当所有记录都匹配时 SQL 连接

    我有3张桌子 CP carthead idOrder CP cartrows idOrder idCartRow CP shipping idCartRow idShipping dateShipped 每个 idOrder 可以有多个 i
  • 处理 C++ 中执行时间的大量分析

    我目前正在进行一个科学计算项目 涉及海量数据和复杂算法 因此需要进行大量代码分析 我目前依靠的是
  • 渲染 ThreeJS 应用程序第一帧时的性能问题

    目前 当我渲染以下内容时 我的 ThreeJS 应用程序的性能受到很大影响第一帧 它会导致 Edge 和 IE 11 浏览器冻结 5 秒 并弹出窗口指示 此窗口没有响应 这可能会吓到我的用户 使用 Chrome 的性能分析器 问题似乎来自几
  • 尝试通过比较不同的表从 SQL 查询输出正确的值

    我对 SQL 非常陌生 需要有关如何使用正确的查询完成此任务的帮助 我有 2 张桌子需要使用 表 TB1 有 id Name 1 bob 2 blow 3 joe 表 TB2 有 compid property 1 bob 2 blow 我
  • 如何查询多个链接服务器?

    链接一些 SQL Server 2008 服务器 实例后 我想对这些服务器进行更通用的查询 我知道我必须像这样指定查询的命运 select from SRV INSTANCE dbname dbo foo 但是 我会针对多个链接服务器运行此
  • 有很多数据库视图可以吗?

    我很少 每月 每季度 使用 Microsoft SQL Server 2005 数据库视图生成数百份 Crystal Reports 报告 在我不读取这些视图的所有时间里 这些视图是否会浪费 CPU 周期和 RAM 因为我很少从视图中读取数
  • Mac OS X Yosemite/El Capitan 上自动启动 MySQL 服务器

    我想在启动时自动启动 MySQL 服务器 这在小牛队是可能的 但在优胜美地似乎不起作用 edit 似乎这也适用于 El Capitan dcc 非常接近 这是 MySQL 在 Yosemite 上再次自动启动的方式 The com mysq
  • 使用 Hibernate 和 MySQL、全局和本地进行 Spring 事务管理

    我正在使用 MySQL Server 5 1 Spring 3 0 5 和 Hibernate 3 6 开发 Web 应用程序 我使用 Springs 事务管理 我是新手 所以如果我问一个容易回答的问题 请耐心等待 1 我读到了有关全局 x
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • 如果一列没有值,MySQL 返回最大值或 null

    我尝试获取 mysql select 的最大值 但如果有一行不包含时间戳 则希望将其设置为 null empty 0 表统计数据 简化 ID CLIENT ORDER DATE CANCEL DATE 1 5 1213567200 2 5
  • mysql 在 sum() 函数上使用 concat,例如 concat(sum(col1),"%")

    我正在尝试合并多个查询 但其中一个查询使用 sum 当我尝试在此列上应用 concat 时 我得到不需要的 blob 结果 我如何在聚合列上应用 concat 和 union 我期待这个结果 SELECT row 1 col1 UNION
  • 将错误保存到 MySQL 数据库

    我有一个 php 查询来更新 MySQL 数据库 请参见下文 sql update hr payroll set payroll number payroll number tax code tax bacs ref bacs ref pa
  • 如何查找列中未使用的ID? [复制]

    这个问题在这里已经有答案了 可能的重复 SQL查询查找丢失的序列号 https stackoverflow com questions 1057389 sql query to find missing sequence numbers 我
  • SQL如何将两个日期之间一小时内的事件相加并显示在一行中

    我正在使用 C 和 SQL Server 2005 开发一份报告 我只需显示我们每小时获得的点击次数 桌子很大 输出应如下所示 Row Date Time Hit Count 1 07 05 2012 8 00 3 2 07 05 2012
  • 在Oracle中查找不包含数字数据的行

    我试图在一个非常大的 Oracle 表中找到一些有问题的记录 即使该列是 varchar2 列 也应包含所有数值数据 我需要找到不包含数字数据的记录 当我尝试在此列上调用 to number col name 函数时 它会抛出错误 我想你可
  • CakePHP - 获取上次运行的查询

    我想获取 CakePHP 运行的最后一个查询 我无法在 core php 中打开调试 也无法在本地运行代码 我需要一种方法来获取最后一个 sql 查询并将其记录到错误日志中而不影响实时站点 该查询失败但正在运行 像这样的事情会很棒 this
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 表达与空列表相同的 IN 条件的可移植方式是什么?

    例如 工作于sqllite3 select from orders where custid and status in 但它失败了postgres ksysdb select code applicable objecttype from
  • #1115 - 未知字符集:'utf8mb4'

    我的电脑上运行着一个本地网络服务器 用于本地开发 我现在正处于导出数据库并导入到我的托管 VPS 的阶段 导出然后导入时出现以下错误 1115 未知字符集 utf8mb4 有人能指出我正确的方向吗 该错误明确表明您没有utf8mb4您的阶段
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它

随机推荐

  • 在Android中升级数据库的正确方法是什么

    如果我想保留一些旧数据并迁移到新版本的数据库 onUpgrade方法中的正确步骤是什么 保留旧数据 删除旧表 创建新表并插入旧数据 有没有简化版本或者有更好的方法 谢谢 升级数据库 在表中添加新字段 在 onUpgrade 中执行以下步骤
  • Mysql 安装程序显示错误:无法写入内存

    我正在尝试安装 MySql Workbench 并下载mysql 安装程序 web community 5 7 13 0 msi 当我运行此文件时 出现以下错误 0x6d4424ff 处的指令引用了 0x6d4424ff 处的内存 内存无法
  • GoPro:获取每帧时间戳

    我目前正在尝试从使用 GoPro 录制的 MPEG 4 文件中提取每个帧时间戳 我想要相机捕获该帧的确切时间 以便稍后将其与计算机视觉算法结合起来 我知道输出帧率为 25 fps 我使用 ffmpeg 和 ffprobe 以不同的方式提取了
  • 用按钮和JS水平滚动隐藏的overflow-x

    我正在尝试使用右侧 左侧的按钮在具有多个 a 标签的 div 中水平滚动 因此我无法使用相同的按钮滚动到 hashtag 我想做的正是与不同标签的 Google 图片搜索标题一样 prsc overflow x hidden overflo
  • Knockout.js 与多个 Select2 绑定

    我的问题是 当我将 Select2 与 Multiple 和 Knockout 视图模型绑定时 选择其中一个选项后 第二次数据丢失 淘汰码 window load function ko bindingHandlers select2 in
  • 使用 MySQL 在 Android 应用程序中存储和显示表情符号

    我有一个应用程序通过套接字与 NodeJS 服务器通信 该服务器通过 HTTP 与 PHP 通信 并且 PHP 正在使用 MySQL 当我尝试在文本字段中插入表情符号并将其保存到数据库时 当我取回它时 我看到 如果我从维基百科复制表情符号
  • 如何生成阳性预测值 (PPV) 与各种分类截止点的关系图?

    我生成了一些分数来帮助预测某些内容是 是 1 还是 否 0 假设数据包括 scores c 10 20 response c 0 0 1 0 1 0 1 1 0 1 1 mydata data frame scores response 我
  • 用 python 绘制 - 折线图取消选择所有

    我得到了一个折线图 其中有多条线代表不同频率的正弦波 我想看一下特定的波浪 而其余的都不在图表中 我知道我可以在图例中单击我不想看到的线条 这样它们就会消失 我想知道是否有一种交互式方式可以一次单击取消选择所有行 而不是单击每一行 My c
  • 使用 ASP.NET 5 中的默认 DI 容器一次性注册所有服务,类似于 Autofac

    对于 ASP NET 5 已经默认提供了一个 DI 它看起来很有趣 我一直在使用 Autofac 和 MVC 5 它可以选择一次注册所有程序集 下面是在 Autofac 中注册所有以 Service 结尾的类的示例代码 Autofac Co
  • React 和 Typescript 与 webpack 打字问题

    我正在尝试创建一个asyncComponent使用 TypeScript 构建高阶组件 但无法完全获得正确的类型 本质上 这可以在 JS 和 webpack 中工作 const Auth asyncComponent gt require
  • 在 ASP.NET MVC3 RC2 中显示复杂类型

    我有一个使用复杂类型作为属性的模型 namespace Web Models public class Business IModel Key HiddenInput DisplayValue false public Guid ID ge
  • 如何查询从 varchar 类型获取最大 id 和数字中的值?

    我有表和列 ID 值为 1 2 3 10 11 12 13 如何查询 varchar 类型的最大 id 我曾尝试过 select MAX id from table 但结果是9 请帮忙 看起来这些值是字符串 它选择最大的字符串 如果您希望它
  • 将 SQLite 设置为 Laravel 5.1 中单元测试的数据库

    我正在尝试在 Laravel 5 1 中设置单元测试 继文档 http laravel com docs 5 1 testing我看到这个 Laravel 在构建时就考虑到了测试 其实支持测试 PHPUnit 是开箱即用的 and 运行测试
  • CSS Div 背景图像固定高度 100% 宽度

    我正在尝试设置一系列具有背景图像的 div 每个 div 都有自己的固定高度 并拉伸以填充宽度 即使顶部 底部被剪切的溢出也是如此 我只是不想要边缘有空白 目前 我有 http jsfiddle net ndKWN http jsfiddl
  • 如何获取java中创建的日期图片

    我想提取 jpg 文件的创建日期 Java 有 File 对象的 lastModified 方法 但似乎不支持从文件中提取创建日期 我相信这些信息存储在文件中 因为当我将鼠标指针悬停在 Win XP 中的文件上时看到的日期与我在 DOS 中
  • 派生类的成员函数是否继承了基类的虚拟性?

    假设我们有以下两个类 A 是具有虚拟析构函数的基类 B 是其析构函数没有 virtual 限定符的派生类 我的问题是 如果我要从 B 派生更多类 B 的析构函数是否会自动继承虚拟性 或者我需要在 B class A public A std
  • Heroku 已成功部署,但我仍然没有运行任何 Web 进程

    我正在尝试将电报机器人推入 Heroku 这些是我的文件夹中的文件 new bot requirements txt Procfile worker python new bot py init py empty new bot py en
  • Zend Framework 路由:参数数量未知

    我正在尝试为 N 级类别深度编写一条路线 因此 通常的类别 URL 如下所示 http website my category my subcategory my subcategory level3 my subcategory leve
  • (UWP) 将网格另存为 png

    我正在开发一个 UWP 应用程序 它有一个带有子项 图像和文本块的网格 我有两件事想要实现并需要帮助 如何使用预定义名称将 Grid 元素及其子内容作为图像 最好是 PNG 保存在本地文件夹中 如何检索此保存的图像 然后将其作为附件与其他兼
  • 为什么这个简单的连接查询使用子查询会明显更快?

    我有两张桌子 order details这是 100 000 行 并且outbound即 10 000 行 我需要加入他们的专栏order number 两者都是 VARCHAR 50 order number 在出站表中不唯一 CREAT