当前位置: 首页 > 面试题库 >

MySQL中的CASE性能?

郭星文
2023-03-14
问题内容

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

而不是使用CASE表达式(例如,在UPDATE查询中),
您始终可以在程序中用
php,python,perljava等编写if语句来选择要发送的查询(例如,以伪代码) ):

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只需要表明在两种情况下都发生了某些事情)

哪种方法具有更好的性能?
性能损失是多少?


问题答案:

几乎 所有的 每行功能都会对性能产生影响,唯一真正的问题是:“影响是否足够小而不必担心?”。

您应该通过测量而不是猜测来发现这一点。如果您的数据和查询均未更改,则数据库管理只是“一劳永逸”的活动。否则,您应该定期监视性能以确保不会发生任何问题。

在上面的评论中,“足够小”是指您不必担心类似以下内容对性能的影响:

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

如果您只有三个朋友。

随着表的增加,这些事情的影响变得更加严重。例如,如果您有1亿个客户,并且希望找到所有可能与计算机相关的客户,那么您就不想尝试:

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

这很可能使您的DBA像一堆砖头一样掉下来。

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

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

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

类似地,第二个查询可能具有插入/更新触发器,name_contains_comp每当更新或插入包含相关文本的条目时,该触发器就会填充新的索引列。

由于大多数数据库的读取比写入的频率要高得多,因此这将计算成本转移到了插入/更新上,从而有效地在所有选择操作中摊销了计算成本。该查询将是:

select name from customers where name_contains_comp = 'Y'

再次,您会发现查询令人眼花fast乱,但插入和更新的速度稍有降低。



 类似资料:
  • 我在mysql查询中使用CASE语句,我必须检查同一查询中是否存在列。 有可能这样做吗?如果是,请帮忙。 我的查询为例- 当“Status”时选择CASE column1,然后选择“Status”当“value”时(当id不为NULL时选择CASE id,然后选择“status1”,否则选择“status2”结束为table1 where condition中的ScheduleStatus)结束为

  • 问题内容: 我正在尝试在MySQL中建立查询,在该查询中我具有某种数字的库存水平,并且取决于该库存水平,我希望它返回另一个值,该值将是颜色代码。 例如,如果库存水平<0,则为空;如果库存水平在0至1000之间,则为红色;如果库存水平在1000至5000之间,则为黄色;如果库存水平在5000至10000之间,则为绿色;如果库存水平> 10000,则为空。绿色。 所以这是我的例子。我有一个Beer表,

  • 问题内容: 我正在尝试使用连接到MySQL数据库的ASP.NET创建GridView。数据如下所示。 根据上面的记录,我希望结果显示如下 我当前的代码如下。这给了我错误(关于DatabaseName.sum的内容不存在。请检查“函数名称解析和解析”部分…) 代码继续 Sum Case最好在这里使用吗? 问题答案: 该错误是由函数名称和括号之间的空格引起的 阅读更多函数名称解析和解析 尝试 这是 S

  • 问题内容: 我知道SQL的语法如下: 但是,我不了解它是如何工作的,可能是因为我正在考虑将其视为声明。 例如,如果我在表中有一个字段,其中包含诸如“经理”,“兼职”等名称,那么如何根据角色生成一个具有不同编号的字段。在此示例中,“如果user_role =’经理’,则role_order = 5”。 请注意,我正在寻找一个 教男人如何钓鱼的方法, 而不是 给男人一个钓鱼的方法 。 问题答案: 更像

  • 问题内容: 我有一个这样的数据库: 我需要拉全部4行 这是我现在的声明: 这很好,因为输出如下: 但是我需要两个timestamp列进行排序,就像它们是一列一样,因此它的排序如下: 我希望这是有道理的。本质上,我试图拥有两个特定于WHERE条件的ORDER BY列。然后,为该行选择正确的ORDER BY列后,它将按时间戳整体对ROWS进行排序。 问题答案:

  • 问题内容: 我想使用一个case语句更新表中的多个列,但是我找不到如何执行此操作的方法(甚至有可能)。我提出了以下无效的参考查询: 有什么方法可以通过有效的SQL达到预期的结果吗? 问题答案: