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 性能? 的相关文章

  • 删除 mysql 数据库中超过 3 个月的行的作业

    我们使用 mysql 服务器作为集中式日志系统 我希望有一项工作来定期删除 清理超过 3 个月的表条目 做这个的最好方式是什么 提前致谢 hinling 您是否在字段中存储项目的创建日期 If so DELETE FROM myTable
  • 列是存在的,但是当我尝试删除它时,它说 MYSQL 中没有列? **错误代码:1091。无法删除...**

    我尝试运行以下查询 ALTER TABLE ORDER DETAIL DROP foreign key USER ID It says Error Code 1091 Can t DROP USER ID check that column
  • 更新\插入数据从grafana到mysql

    可以从grafana更新数据或插入数据到mysql 我需要使用 UI 在 mysql 中插入 更新信息 现在我已经在使用grafana 所以想知道是否有任何方法可以使用grafana来更新或插入信息 没有用于获取用户输入并将该数据插入 My
  • PHP MySQL 查询带有 %s 和 %d

    SELECT COUNT AS test FROM s WHERE id d AND tmp mail lt gt 什么是 s and d for 这些是使用的格式符号 例如经过sprintf 例子 Output SELECT COUNT
  • 有很多数据库视图可以吗?

    我很少 每月 每季度 使用 Microsoft SQL Server 2005 数据库视图生成数百份 Crystal Reports 报告 在我不读取这些视图的所有时间里 这些视图是否会浪费 CPU 周期和 RAM 因为我很少从视图中读取数
  • grails/mysql 时区更改

    完成更改应用程序时区的最佳方法是什么 在我看来 必须发生以下情况 服务器 TZ 已被系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert tz 或等效方法更新所有值 因此 要么必须编写一个 mysql 脚
  • 如果一列没有值,MySQL 返回最大值或 null

    我尝试获取 mysql select 的最大值 但如果有一行不包含时间戳 则希望将其设置为 null empty 0 表统计数据 简化 ID CLIENT ORDER DATE CANCEL DATE 1 5 1213567200 2 5
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • Drupal 视图 - 自定义/修改 SQL

    我遇到了 配置文件复选框 模块的问题 该模块存储以逗号分隔的自定义配置文件字段 问题是我是否创建一个视图来按值过滤 SQL 结果最终是这样的 AND profile values profile interests value in Bus
  • PostgreSQL:有效地将 JSON 数组拆分为行

    我有一个表 表 A 其中包含一个包含 JSON 编码数据的文本列 JSON 数据始终是一个包含一到几千个普通对象的数组 我有另一个表 表 B 其中有几列 包括数据类型为 JSON 的列 我想从表 A 中选择所有行 将 json 数组拆分为其
  • T-SQL 中是否有 LIKE 语句的替代方案?

    我有一个场景我需要执行以下操作 SELECT FROM dbo MyTable WHERE Url LIKE
  • 每个搜索词显示一行,如果未找到则替换默认值

    Query SELECT product id name FROM product WHERE barcode in 681027 8901030349379 679046 679047 679082 679228 679230 67923
  • 如何使用内联 SQL 参数化 IN 语句的集合? [复制]

    这个问题在这里已经有答案了 可能的重复 参数化 SQL IN 子句 https stackoverflow com questions 337704 parameterizing a sql in clause 你好 我有一个查询 如下所示
  • MySQL 将 ÅäÖ 视为 AAO?

    这两个查询给了我完全相同的结果 select from topics where name Harligt select from topics where name H rligt 这怎么可能 看起来mysql在搜索时会将 翻译成aao
  • CakePHP - 获取上次运行的查询

    我想获取 CakePHP 运行的最后一个查询 我无法在 core php 中打开调试 也无法在本地运行代码 我需要一种方法来获取最后一个 sql 查询并将其记录到错误日志中而不影响实时站点 该查询失败但正在运行 像这样的事情会很棒 this
  • 数据库中的持久日期不等于检索日期

    我有一个具有 Date 属性的简单实体类 此属性对应于 MySQL 日期时间列 Entity public class Entity Column name start date Temporal TemporalType TIMESTAM
  • #1115 - 未知字符集:'utf8mb4'

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

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • 为什么我的浮点数大于 1 时在 MYSQL 中存储为 .9999?

    我将进程时间作为 float 4 4 存储在 MySQL 数据库中 start time microtime TRUE things happen in my script end time microtime TRUE process t
  • WHERE 条件基于 PK 的查询是否建议使用“LIMIT 1”?

    我正在查询 mySQL 数据库以检索 1 个特定行的数据 我使用表主键作为 WHERE 约束参数 E g SELECT name FROM users WHERE userid 4 userid 列是表的主键 在 mySQL 语句末尾使用

随机推荐

  • 启动时 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