优化 SQL 查询

优化 sql 查询

在编写查询时,我们应该始终花时间找到编写查询的最佳方式。

有时,这可能意味着使用表面上看起来速度不快但实际上速度很快的方法。

查询优化对于拥有高效的网站至关重要。

虽然查询优化也适用于报告和分析,但作为 web 服务一部分运行的查询是网站用户最关注的查询。

在本文中,我使用 mysql 测试员工数据库:https://dev.mysql.com/doc/employee/en/

模式

create table `employees` (  `emp_no` int not null,  `birth_date` date not null,  `first_name` varchar(14) not null,  `last_name` varchar(16) not null,  `gender` enum('m','f') not null,  `hire_date` date not null,  primary key (`emp_no`),  key `name` (`first_name`,`last_name`) )
create table `salaries` (  `emp_no` int not null,  `salary` int not null,  `from_date` date not null,  `to_date` date not null,  primary key (`emp_no`,`from_date`),  key `salary` (`emp_no`,`salary`))

薪水表可以多次包含同一员工,每次员工薪水发生变化时,薪水表中都会出现一个新行。

任务

此查询的任务是返回年收入超过 50,000 美元的员工编号、名字、姓氏的唯一列表。

除了选择数据之外,我们还需要确保没有重复的员工。

使用 distinct

select distinct    employees.emp_no,    first_name,    last_namefrom    employees    inner join salaries using (emp_no)where    salary > 50000

一般来说,使用 distinct 表明查询可以写得更好。

distinct 获取所有可能的行,并在查询过程结束时删除不需要的重复行。

distinct 是根据所有选定的行计算的。这可能意味着在某些情况下可能会返回重复的名称。

可能发生这种情况的一个示例是,如果我们包含一个员工的每一行都发生更改的列,例如 salary

select distinct    employees.emp_no,    first_name,    last_name,    salaryfrom    employees    inner join salaries using (emp_no)where    salary > 50000

查询执行计划:

-> table scan on   (cost=241946..245972 rows=321886)   └─> temporary table with deduplication  (cost=241946..241946 rows=321886)      └─> nested loop inner join  (cost=209757 rows=321886)         ├─> filter: (salaries.salary > 50000)  (cost=97097 rows=321886)         │  └─> index scan on salaries using salary  (cost=97097 rows=965756)         └─> single-row index lookup on employees using primary (emp_no=salaries.emp_no)  (cost=0.25 rows=1)

执行计划显示使用了临时表,成本较高。临时表的查询速度通常较慢。有时它们是必要的,但如果您能找到一种不使用临时表的查询方法,通常会更有效。

平均响应时间:745ms

使用 group by

确保唯一用户的常用方法是使用 group by

group by 通常比 distinct 更快。它不需要删除重复项的最后一步来完成查询计划

select    employees.emp_no,    first_name,    last_namefrom    employees    inner join salaries using(emp_no)where    salary > 50000group by    employees.emp_no

查询执行计划:

-> table scan on   (cost=241946..245972 rows=321886)   └─> temporary table with deduplication  (cost=241946..241946 rows=321886)      └─> nested loop inner join  (cost=209757 rows=321886)         ├─> filter: (salaries.salary > 50000)  (cost=97097 rows=321886)         │  └─> index scan on salaries using salary  (cost=97097 rows=965756)         └─> single-row index lookup on employees using primary (emp_no=salaries.emp_no)  (cost=0.25 rows=1)

虽然 group by 比 distinct 稍快,但执行计划是相同的。这种情况下它们之间的区别一般与内部查询优化器、查询缓存等有关。

虽然执行计划非常有用,但它们并不总能为您提供内部发生的全部情况,这会导致可能具有相同执行计划的查询之间存在细微的差异。

平均响应时间:721ms

使用子查询

虽然子查询通常被认为效率较低,但有时它们可​​以减少行数,从而使查询速度更快。

在本例中,我们将使用子查询来查找工资超过 50,000 美元的员工编号

select    employees.emp_no,    first_name,    last_namefrom    employeeswhere    emp_no in(        select            emp_no from salaries        where            salary > 50000)

使用该方法,查询时间显着下降。

查询执行计划:

-> nested loop inner join  (cost=89029 rows=33961)   ├─> remove duplicates from input sorted on salary  (cost=5161 rows=33961)   │  └─> filter: (salaries.salary > 50000)  (cost=5161 rows=33961)   │     └─> index scan on salaries using salary  (cost=5161 rows=965756)   └─> single-row index lookup on employees using primary (emp_no=salaries.emp_no)  (cost=80472 rows=1)

在这里您将看到查询不再使用临时表,而是使用更简单的计划,成本值更低。

这些因素导致响应时间更快。

平均响应时间: 234ms

虽然使用子查询显着提高了查询性能,但我们也许可以通过使用 exists 子句获得更好的结果,这比子查询中使用的 in 语句具有一些优势。

使用存在

使用 exists 时,查询一旦找到匹配项就会提前终止。在这种情况下,一旦找到特定员工,它就会提前终止。

虽然某个员工的工资表中有多行,但如果找到匹配的行,则不需要继续检查该特定员工是否存在,因此它会停止查找该员工并继续寻找下一个员工一个。

select    employees.emp_no,    first_name,    last_namefrom    employeeswhere    exists (        select            1        from            salaries        where            salaries.emp_no = employees.emp_no            and salary > 50000)

我们在此查询中使用 select 1 因为 exists 只返回 true 或 false,而不返回该行包含的内容。

虽然我们可以使用 select emp_noselect *,但返回常量可以使查询的意图更清晰,并且在某些情况下可以更高效。

查询执行计划:

-> nested loop inner join  (cost=89029 rows=33961)   ├─> remove duplicates from input sorted on salary  (cost=5161 rows=33961)   │  └─> filter: (salaries.salary > 50000)  (cost=5161 rows=33961)   │     └─> index scan on salaries using salary  (cost=5161 rows=965756)   └─> single-row index lookup on employees using primary (emp_no=salaries.emp_no)  (cost=80472 rows=1)

虽然此查询计划与子查询查询计划相同,但提前终止可以提高执行时间。

平均响应时间:220ms

概括

独特:745ms
分组依据:721ms
子查询:234ms
存在:220ms

使用子查询并不总是最有效的查询方法,但是,在这种情况下,它可以显着改善您的查询。

虽然仅更改查询可以帮助修复缓慢的查询,但还可以考虑其他优化。

创建更好的索引也可以帮助解决缓慢的查询问题,但是添加索引应该保留在重写查询无法帮助查询提高效率的时候。

对自己的数据尝试不同的查询策略非常重要。虽然 exists 是查询此数据集时最有效的策略,但其他数据集的结果可能有所不同,因此请尝试各种查询,看看哪一个最适合您。

以上就是优化 SQL 查询的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/55087.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 19:11:01
下一篇 2025年11月9日 19:14:37

相关推荐

  • 币安官网安全进入 币安新版本下载安装

    安全访问币安官方网站的核心方法 网络钓鱼和诈骗网站是数字资产安全的主要威胁。为了保护您的资产,请务必通过正确和安全的方式访问币安官网。 币安官网直达: 币安官方app: 1. 手动输入与书签收藏 访问币安最安全的方式,是手动在浏览器地址栏中输入官方网址。首次确认访问的是真实官网后,立即将其添加到您的…

    好文分享 2025年12月8日
    000
  • 如何创建火币账户通行密钥(图文)

    目录 如何在火币APP端添加通行密钥?如何在web端添加通行密钥? htx是全球知名的数字资产交易平台(官方注册 官方下载),致力于为用户提供安全、高效、便捷的加密货币交易服务。自2013年成立以来,htx已连续十二年保持零安全事故记录,安全防护能力位居行业前列,赢得全球超4,000万用户的信赖与支…

    2025年12月8日 好文分享
    000
  • Berachain:流动性证明是什么?有什么特点?

    目录 什么是berachain? 什么是流动性证明? 流动性证明与权益证明的对比 Berachain的特别之处是什么? 突出特点 流动性证明(PoL)共识:双代币模型:EVM兼容性:BeaconKit框架:激励市场: 技术架构 结论 ‍Berachain是一个创新的EVM兼容的Layer 1区块链,…

    2025年12月8日
    000
  • 比特币价格暴涨,普通人现在入场还来得及吗?

    近期比特币价格的剧烈上涨,再次点燃了市场的热情,也让许多普通投资者心生疑问:现在上车,还来得及吗?这是一个没有标准答案的问题,因为它同时包含了机遇与巨大的风险。要做出明智的决策,我们需要从正反两方面进行审视。 2025年比特币主流的交易所: 欧易官网:   币安官网:   火币官网: 为什么现在入场…

    2025年12月8日
    000
  • DePIN是什么?是一个好投资吗?2025年值得关注的5大DePin项目推荐

    目录 什么是DePIN?为什么2025年是DePin之年DePIN生态系统和市场趋势的分析概述2025年值得关注的5大DePIN项目Filecoin (FIL)Filecoin的功能Filecoin的实际应用为什么在2025年投资Filecoin?Render Network (RENDER)Ren…

    2025年12月8日 好文分享
    000
  • 什么是流动性质押代币?如何运作?新手指南

    目录 什么是流动性质押? 什么是流动性质押代币(LST)? 例子: Liquid Staking 的工作原理:分步说明 Liquid Staking 对交易者的好处 获得流动性复合盈利机会 3.资本效率 DeFi 之间的互操作性 流动性质押 vs. 传统质押 风险与注意事项 热门的 Liquid S…

    2025年12月8日
    000
  • 无需KYC实名认证即可交易的虚拟币交易平台排行榜

    一些用户出于隐私保护或住在受限地区,可能希望使用无需提供身份证明即可交易的平台。这类平台包括点对点交易平台、去中心化交换平台(dex)以及部分中心化平台的低等级账户。 如果你还没注册账户可以选择下方交易所官方渠道链接: 以下整理了在 2025 年仍提供无需 KYC 的平台(或条件性非 KYC 权限)…

    2025年12月8日 好文分享
    000
  • 区块链十大跨链技术:实现链间互联互通的先锋方案(最新进展)

    随着不同公链生态的蓬勃发展,资产和数据在孤立的区块链之间流转的需求日益迫切。跨链技术作为打破“孤岛效应”的关键,正在成为Web3世界最重要的基础设施之一。本文将为您盘点当前市场上最受瞩目的十大跨链技术方案,帮助您理解它们如何构建互联互通的区块链未来。 全球主流币交易平台推荐 Binance: OK:…

    2025年12月8日 好文分享
    200
  • 区块链十大生态系统:构建去中心化未来的关键网络(最新洞察)

    本文旨在梳理当前Web3领域最具影响力的十大区块链生态系统,帮助您快速了解构建去中心化未来的核心力量。这些网络凭借其独特的技术优势、庞大的开发者社区和繁荣的应用场景,共同描绘了下一代互联网的宏伟蓝图。 全球主流币交易所官网地址推荐 1、币安binance: 2、欧意OK: 3、HTX火币:     …

    2025年12月8日 好文分享
    100
  • 区块链分叉是什么?如何理解和应对区块链网络分叉?

    区块链分叉是网络升级和社区分歧的自然结果,1、软分叉为向前兼容的温和升级,旧节点仍可验证新区块;2、硬分叉则导致链永久分裂,所有节点必须升级否则留在原链;3、分叉原因主要包括技术升级、社区理念分歧和意外网络问题;4、用户应对策略为关注官方信息、了解资产映射规则、警惕诈骗风险并暂停分叉时的操作,以确保…

    2025年12月8日
    000
  • 如何通过定投布局比特币_适合普通投资者吗

    如何通过定投布局比特币?适合普通投资者吗? 比特币作为高波动性资产,其价格起伏剧烈,短期内难以精准把握买入时机。定投(Dollar-Cost Averaging,DCA)策略则成为很多普通投资者控制风险、稳步积累资产的有效方法。 Binance币安 官网直达: 安卓安装包下载: 欧易OKX ️ 官网…

    2025年12月8日
    100
  • 一分钟教会稳定币和数字货币(普通人八大投资工具)

    数字货币市场日渐活跃,其中稳定币和数字货币是普通投资者关注的两类资产。它们各自具有独特属性,了解这些特性对于构建合理的投资认知至关重要。本文旨在帮助您快速理解这两种数字资产,并介绍普通人可以考虑的投资工具和策略。 稳定币解析 1. 稳定币是一种特殊类型的数字货币,其价值通常与某种稳定资产挂钩,例如美…

    2025年12月8日
    000
  • NEAR币近期生态频繁扩张 是否利好NEAR币价?

    近期,NEAR协议(NEAR Protocol)动作频频:不但在AI、DePIN等热门赛道积极布局,还通过链上互操作性与EVM兼容性吸引了大量开发者与资金。这一轮生态扩张是否将为NEAR币带来实质利好?本文将带你全面解读。 在了解NEAR币前,建议先通过主流交易平台完成账户注册,以便随时查看NEAR…

    2025年12月8日
    000
  • Cosmos、ATOM 与互操作性:一个新时代?

    探索 cosmos 的战略转型、atom 的潜力与区块链互操作性的未来 Cosmos、ATOM 与互操作性:一个新时代的到来? Cosmos(ATOM)因其在互操作性方面的专注正日益受到关注。该网络正积极推广其跨链通信协议(IBC),市场对此也表现出积极态度。让我们一起来看看 Cosmos 生态系统…

    2025年12月8日
    000
  • 山寨币BCD项目白皮书核心内容摘要

    山寨币BCD项目白皮书核心内容摘要 bcd是一种面向web3基础设施场景的加密货币,旨在通过构建模块化金融协议与可拓展的链上数据层,为开发者和用户提供更低成本、更高透明度的数字资产交互体验。其白皮书内容围绕技术架构、代币经济模型、治理机制与应用场景四大板块展开。以下为核心内容精要概览,帮助投资者快速…

    2025年12月8日
    000
  • 2025最新山寨币行情分析_山寨币涨跌趋势全面解读

    2025最新山寨币行情分析_山寨币涨跌趋势全面解读 山寨币作为加密货币市场的重要组成部分,因其丰富的项目类型和较高的波动性备受投资者关注。2025年,山寨币行情呈现多样化走势,投资者需深入分析各币种的市场表现、技术进展及资金流动,才能把握投资机会。本文将围绕当前主流山寨币的涨跌趋势做全面解读,帮助您…

    2025年12月8日
    000
  • MANTRA、Google Cloud 与 $OM 热潮:是什么在推动 RWA 革命?

    mantra的$om代币正在快速上涨,这波涨势由谷歌云验证、战略性的代币销毁以及现实资产合作推动。这是更大行情启动的信号吗? 大家注意了!现实世界资产(RWAs)赛道正逐步升温,而拥有谷歌云支持的MANTRA及其$OM代币正试图在这一领域占据领先地位。我们来梳理一下最近的发展动态,并探讨其背后的意义…

    2025年12月8日
    000
  • Pump.fun的5亿美元ICO:迷因币狂热还是融资未来?

    pump.fun以5亿美元的ico纪录在加密圈引发热议。这是一时的热潮,还是代币发行新时代的信号?我们一起来深入探讨。 Pump.fun的5亿美元ICO:模因币狂潮还是融资新模式? 仅用12分钟便完成5亿美元的ICO募集,Pump.fun的消息震惊了整个行业。这是ICOs(首次代币发行)的新篇章开启…

    2025年12月8日
    000
  • 加密货币、佩佩与亿万富翁押注:解读最新趋势

    探索加密货币、模因币(如 pepe)与加密亿万富翁投资策略的交汇点,把握市场关键动向与潜在趋势。 加密世界一如既往地充满活力,当前人们的注意力正集中在模因币上,尤其是与 Pepe 相关的项目。与此同时,大家也在密切关注着那些大资金持有者的动向。让我们一同走进“加密、Pepe、亿万富翁布局”的世界,挖…

    2025年12月8日
    000
  • 氦气数据中心、人工智能与战略多元化:NEHC 的新时代?

    new era helium(nehc)正将业务拓展至人工智能基础设施领域,计划在德克萨斯州打造一座250兆瓦的数据中心。此举是否能带来预期收益?我们来深入探讨。 氦气、数据中心与AI:NEHC的新篇章? 通过启动大型数据中心项目,New Era Helium(NEHC)正式进入人工智能基础设施市场…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信