tsd*_*sds 5 mysql sql performance case
我想知道是否使用CASE ... WHEN ...那么MySQL查询中的表达式
会对性能产生负面影响吗?
而不是使用CASE表达式(例如在你的UPDATE查询中)
你总是有可能在你的程序
中使用php,python,perl,java等编写if语句来选择要发送的查询(例如伪代码) ):
prepareStatement(
"UPDATE t1 SET c1=c1+1, msg=CASE (@v:=?) WHEN '' THEN msg ELSE @v END"
);
setStatementParameter(1, message);
Run Code Online (Sandbox Code Playgroud)
或者是:
if (message == "") {
prepareStatement("UPDATE t1 SET c1=c1+1");
} else {
prepareStatement("UPDATE t1 SET c1=c1+1, msg=?");
setStatementParameter(1, message);
}
Run Code Online (Sandbox Code Playgroud)
(这里需要c1只是为了表明两种情况都会发生的事情)
采取什么方式有更好的表现?
性能损失是多少?
pax*_*blo 12
所有每行功能都会对性能产生影响,唯一真正的问题是:"影响是否足够小,不用担心?".这是你应该通过测量而不是猜测来发现的.如果您的数据和查询都没有发生变化,那么数据库管理只是一种"一劳永逸"的活动.
否则,您应该定期监视性能以确保不会出现问题.
在上面的评论中,"足够小",我的意思是,您可能不必担心以下内容对性能的影响:
select * from friends where lowercase(lastname) = "smith"
Run Code Online (Sandbox Code Playgroud)
如果你只有三个朋友.
随着桌子尺寸的增加,这些事情的影响变得更加严重.例如,如果您有一亿个客户,而您想要找到所有可能与计算机相关的客户,那么您不会想要尝试:
select name from customers where lowercase(name) like '%comp%'
Run Code Online (Sandbox Code Playgroud)
这可能会让你的DBA像大量的砖块一样落在你身上.
我们过去解决这个问题的一种方法是在数据中引入冗余.使用第一个示例,我们将添加一个额外的列lowerlastname,并使用小写值填充它lastname.用于搜索目的的索引和您的select语句变得非常快,应该如此.
对于我们备受喜爱的3NF,这会怎么做,我听到你问?答案是什么,如果你知道你在做什么:-)
您可以设置数据库,以便通过插入/更新触发器填充此新列,以保持数据一致性.如果您了解并减轻后果,那么出于性能原因打破3NF是完全可以接受的.
类似地,第二个查询可以有一个插入更新触发器,name_contains_comp只要更新或插入包含相关文本的条目,就会填充新的索引列.
由于大多数数据库的读取次数远远超过它们的读取次数,因此会将计算成本转移到插入/更新,从而在所有选择操作中有效地分摊它.该查询将是:
select name from customers where name_contains_comp = 'Y'
Run Code Online (Sandbox Code Playgroud)
同样,您会发现查询速度非常快,只需稍微降低插入和更新速度.
| 归档时间: |
|
| 查看次数: |
7337 次 |
| 最近记录: |