MySQL 中的 CASE 性能?

2024-03-26

我想知道是否在 MySQL 查询中使用 CASE ... WHEN ... THEN 表达式
对性能有负面影响吗?

而不是使用 CASE 表达式(例如在 UPDATE 查询中)
你总是有可能在你的程序中做出 if else 语句
用 php、python、perl、java...编写来选择要发送的查询,例如(伪代码):

prepareStatement(
"UPDATE t1 SET c1=c1+1, msg=CASE (@v:=?) WHEN '' THEN msg ELSE @v END"
);
setStatementParameter(1, message);

或欧洲:

if (message == "") {
    prepareStatement("UPDATE t1 SET c1=c1+1");
} else {
    prepareStatement("UPDATE t1 SET c1=c1+1, msg=?");
    setStatementParameter(1, message);
}

(这里的 c1 只是为了表明在这两种情况下都会发生一些事情)

怎样做才能有更好的性能呢?
性能损失是多少?


差不多all每行函数都会对性能产生影响,唯一真正的问题是:“影响是否小到不用担心?”。

您应该通过测量而不是猜测来发现这一点。如果您的数据和查询都没有改变,那么数据库管理只是一项“一劳永逸”的活动。否则,您应该定期监控性能以确保不会出现问题。

上面评论中的“足够小”,我的意思是,您可能不必担心以下内容对性能的影响:

select * from friends where lowercase(lastname) = "smith"

如果你只有三个朋友。

随着表大小的增加,这些因素的影响变得更加严重。例如,如果您有一亿个客户,并且您想找到所有可能与计算机相关的客户,您就不会想尝试:

select name from customers where lowercase(name) like '%comp%'

这可能会让 DBA 像一堆砖头一样打击你。

我们过去解决此问题的一种方法是在数据中引入冗余。使用第一个示例,我们将添加一个名为的额外列lowerlastname并用小写值填充它lastname。然后将其编入索引以用于搜索目的,然后您的select声明变得快得令人眼花缭乱,这是理所应当的。

我听到你问,这对我们深受喜爱的 3NF 有何影响?答案是“不多”,如果你知道自己在做什么:-)

您可以设置数据库,以便由插入/更新触发器填充此新列,以保持数据一致性。如果您了解并减轻后果,出于性能原因违反 3NF 是完全可以接受的。

同样,第二个查询可以有一个插入/更新触发器来填充新的索引列name_contains_comp每当更新或插入包含相关文本的条目时。

由于大多数数据库的读取次数远多于写入次数,因此这会将计算成本转移到插入/更新,从而有效地将其分摊到所有选择操作中。那么查询将是:

select name from customers where name_contains_comp = 'Y'

同样,您会发现查询速度快得令人眼花缭乱,但插入和更新速度稍慢。

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

MySQL 中的 CASE 性能? 的相关文章

  • Hibernate + MySQL + rewriteBatchedStatements=true

    我有以下 Hibernate 配置
  • 需要 SQL 查询澄清[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个由以下列组成的表 billid patientid doctorid fees 如何显示治疗多名患者的医生 尝试了以下代码并得到了
  • 在上下文中提取搜索字符串

    我正在尝试执行 MySQL 查询 在上下文中提取搜索字符串 因此 如果搜索是 mysql 我想从 body 列返回类似的内容 下载后只需几分钟MySQL安装程序即可使用 这就是我现在得到的 但它不起作用 因为它只是从正文字段中获取前 20
  • 如何使用wireshark清晰捕获mysql查询sql

    因为我们使用远程开发Mysql服务器 所以不能轻易检查查询sql 如果使用本地服务器可以tail f general log file查看调用某个http接口时执行了哪些sql 所以我安装了一个wireshark捕获这些从本地发送的查询sq
  • 当从属文本框中没有输入文本时,如何让 gridview 显示所有表格行?

    下面的代码可以正常工作 并根据文本框中输入的文本过滤我的网格视图 当我的文本框中没有输入任何文本时 我没有得到任何结果 并且无法理解为什么 我的问题 如何让gridview显示all当文本框中没有输入文本时表行 MSSQL Search n
  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • postgresql:插入...(选择*...)

    我不确定它是否是标准 SQL INSERT INTO tblA SELECT id time FROM tblB WHERE time gt 1000 我正在寻找的是 如果 tblA 和 tblB 位于不同的数据库服务器中怎么办 Postg
  • oursql 中的参数化查询

    如果有人能告诉我是否可以使用命名占位符进行参数化查询 我将不胜感激oursql 一个用于与 MySQL 数据库交互的 python 模块 例如 我尝试了一种可以与 sqlite3 一起使用的查询 c execute select from
  • MySQL集群启动失败

    这不是我第一次创建ndbcluster 但我没有收到这样的问题 我正在关注本手册 https hub docker com r mysql mysql cluster by mysql团队 我正在使用回显的默认配置在此 GitHub 存储库
  • 更好地理解 SQL Server 中的架构

    就像标题一样 我还是一个SQLServer菜鸟 当我创建表 Mytable 时 数据库中显示 dbo Mytable 但有人能让我更好地理解模式吗 另外 在 Server 2008 TSQL 一书中 Itzik 说 在你的数据库中 表属于模
  • Java、Oracle 中索引处缺少 IN 或 OUT 参数:: 1 错误

    您好 我使用 Netbeans 8 0 2 和 Oracle 11g Express Edition 在 JSF 2 2 中编写了一个图书馆管理系统 我有几个名为 书籍 借阅者 等的页面 以及数据库中一些名为相同名称的表 我的问题是这样的
  • 从 Grib 天气模型中提取数据

    我已经下载了grib1模型数据来自GFS http en wikipedia org wiki Global Forecast System 我使用的是 Mac OS X 并且能够构建wgrib2文件来自NOAA http en wikip
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 日期时间与时间戳字段

    我是 MySQL 数据库的新手 您是否建议在表创建中使用日期时间或时间戳字段以及原因 我正在使用 MySQL 5 7 和 innodb 引擎 Thanks 我会用TIMESTAMP对于任何需要自动管理的事情 因为它支持诸如ON UPDATE
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • 使用连接池后如何处理过多的并发连接?

    Scenario 假设您有一个拥有大量流量的网站或应用程序 即使使用数据库连接池 性能也会受到真正的打击 站点 应用程序甚至可能崩溃 因为并发连接太多 Question 人们有什么选择来处理这个问题 我的想法 我在想有这个问题的人可以创建多
  • 无法在 mysql-apt-config [Ubuntu 14.04] 中选择“确定”

    我使用的是 Ubuntu 14 04 sudo apt get update总是给我这个选项来配置 mysql apt config 我尝试选择版本 按 tab gt 在 确定 上突出显示的键 按 Enter 但没有任何反应 它再次返回并突
  • MySQL 可选的带有 MATCH 的 LEFT JOIN

    我有以下查询 它对 MySQL Innodb 数据库中同一搜索词的两个不同表中的两列执行全文搜索 SELECT Id MATCH tb1 comment tb2 comment AGAINST search term IN BOOLEAN
  • WHERE NOT EXIST 附近的语法错误

    我在堆栈中搜索 但没有一个达到最终答案 我的查询是这样的 INSERT INTO user username frequence autoSend VALUES feri2 3 1 WHERE NOT EXISTS SELECT FROM

随机推荐

  • 启动时 LiteSQL DB 不为空

    我认为这是一个相当简单的问题 我对 Android 的东西还太年轻 我想准备将使用数据库的应用程序 在我展示的每个示例中 都有一个空数据库 其中首先启动应用程序 然后进行一些插入 我希望应用程序具有相当大的数据库 因此我希望在应用程序启动时
  • 对于具有行间距和多种颜色的单行文本,UILabel 大小不正确

    我很确定这实际上是一个 UIKit 错误 但想获得一些输入来看看我是否在这里遗漏了一些愚蠢的东西 这是我的代码 single line with modified line spacing and 2 colors broken line
  • MVC3 中的 IValidatableObject - 客户端验证

    使用 MVC3 您可以使用两种新机制来添加自定义验证 它们是 1 ValidationAttribute 子类或 2 实现 IValidatableObject ValidationAttribute 允许您通过实现 IClientVali
  • 在哪里可以找到使用 RSpec 测试 Thor 脚本的好示例?

    在哪里可以找到使用 RSpec 测试 Thor 脚本的好示例 到目前为止 我的搜索还没有找到任何好的结果 尝试 Thor 自己的存储库 https github com wycats thor tree master spec https
  • Unity 的 YUV 着色器?

    我在 Unity 中有一些 适当的 平面的 YUV 纹理 我只想看看它们供开发使用 Unity 他们的着色器语言变体 实际上有一个可用的 YUV 着色器吗 从概念上讲 从 YUV 转换为 RGB 很简单 但有点繁琐 YUV 到 RGB 转换
  • ASP.NET MVC 3 中的 OutputCache 行为

    我刚刚在 ASP NET MVC 3 的 RC 版本中测试输出缓存 不知何故 它不尊重 VaryByParam 属性 或者更确切地说 我不确定我理解发生了什么 public ActionResult View UserViewCommand
  • 如何捕获 Web 服务抛出的肥皂异常?

    我成功地在我的网络服务中抛出了一些肥皂异常 我想捕获异常并访问异常调用的字符串和 ClientFaultCode 以下是我在 Web 服务中的一个例外示例 throw new SoapException You lose the game
  • 如何根据偏航角计算方向矢量?

    我有一个问题 我不知道如何使用 Java LWJGL 计算方向向量以在 OpenGL 中渲染 我有以下系统 X 转到屏幕右侧 Z 进入我的屏幕 Y 转到屏幕顶部 高度 因此我正在XZ平面上行走 现在我想要执行 已经执行了WASD运动 并且它
  • 当我所做的只是一个列表时,为什么 Hibernate 会删除我的集合条目?

    我似乎有一个相当奇怪的问题 我在 JSP 中显示用户及其角色 由于某种原因 角色仅在第一次加载页面时显示 我刷新页面 角色全部从数据库中删除了 我的设置是标准 Spring MVC JPA Hibernate 通过 Spring Data
  • 标签发布

    是否可以仅从 a 标签 我知道锚标记通常仅用于 GET 并且我知道我可以使用 javascript 来执行此操作 例如JavaScript post 请求就像表单提交 https stackoverflow com questions 13
  • opencv错误:输入参数的大小不匹配

    我正在使用金字塔进行图像混合 我收到 opencv 错误 我正在关注官方 opencv 教程 http docs opencv org 3 0 beta doc py tutorials py tutorials html http doc
  • 确认()对话框中是/否按钮而不是确定/取消?

    In an Adobe AIR HTML JS app is it possible to display Yes No buttons instead of OK Cancel in a confirm dialog 任何可以与webki
  • Android:从HOME重新启动后保留任务的活动堆栈

    我的应用程序有两项活动 我按以下顺序开始 HOME gt A gt B 现在我按 HOME 并再次启动 A 我希望在 A 顶部看到活动 B 但我得到的是 A 因此活动堆栈被清除 显现
  • 如何使用 JavaScript / Tone.js 更改音调和播放速率?

    我想同时完成两件事 1 改变播放速率声音文件的速度为 1 2 2 降低pitch五分之一 最后 我不想使用单独的按钮来播放结果将其连接到音频标签并使用那里的播放按钮 下面是我迄今为止使用 Tone js 得到的最接近的结果 我真的很难处理文
  • 使用 jQuery 创建 HTML 元素最有效的方法是什么?

    最近我做了很多模态窗口弹出窗口之类的事情 我使用了 jQuery 我用来在页面上创建新元素的方法绝大多数是沿着以下路线 div div 但是 我感觉这不是最好或最有效的方法 从性能角度来看 在 jQuery 中创建元素的最佳方法是什么 这个
  • 具有位字段的结构中的偏移量

    如果我们有一个带有位字段的结构体 那么结构体中的后续成员如何对齐 考虑以下代码 struct A int a 1 char b at offset 1 struct B int a 16 int b 17 char c at offset
  • 如何从当前文件夹旁边的文件夹导入模块?

    我已经检查了尽可能多的页面 并尝试了我找到的所有内容 但没有一个成功 我还检查了有关导入的 PEP 页面并尝试了每个示例 但没有一个起作用 我有一个包含单元测试的测试文件夹 我需要导入我想要测试的模块 这些模块位于 src 文件夹旁边的名为
  • 子类化 datetime.timedelta 时出现奇怪的行为

    为了方便起见 我想创建 datetime timedelta 的子类 这个想法是这样定义一个类 class Hours datetime timedelta def init self hours super Hours self init
  • 如何将 SQLite 与 AngularJS 集成?

    我正在使用 google 地图 api v3 和一个名为 ng map 的插件制作一个 angularjs 应用程序 但我想将一些坐标存储在 SQLite 数据库中 然后从应用程序中检索 基本上 你不能 但是 如果您正在开发混合移动应用程序
  • MySQL 中的 CASE 性能?

    我想知道是否在 MySQL 查询中使用 CASE WHEN THEN 表达式对性能有负面影响吗 而不是使用 CASE 表达式 例如在 UPDATE 查询中 你总是有可能在你的程序中做出 if else 语句用 php python perl