PHQL update语法解析的疑问?
程序员文章站
2022-05-14 21:08:04
...
先上demo代码(phalcon框架):
$phql = "UPDATE Cars SET price = 15000.00 WHERE name = 'focus'";
$result = $manager->executeQuery($phql);
if ($result->success() == false) {
foreach ($result->getMessages() as $message) {
echo $message->getMessage();
}
}
通过监听phalcon的底层SQL生成,上述示例代码,会被解析成两个SQL语句:
select * from cars where name='focus';
#此处的id=1是根据上一条select返回记录的主键值
update cars set price=15000.00 where id=1
也就是说,PHQL底层在执行update语句时,会先根据条件查询相关记录,再根据相关记录的主键值去更新数据。
如果从查询优化的角度来说, 若是更新条件没有做索引处理,那必然会引起性能损耗。PHQL底层自动转化为以主键为更新条件,这也算是规避了这种风险。
但是从SQL执行的角度来看, 每一次更新操作,都需要执行两条SQL,这又算不算是另一种性能损耗了?
不知道这种处理方式算不算是一个坑 ?
回复内容:
先上demo代码(phalcon框架):
$phql = "UPDATE Cars SET price = 15000.00 WHERE name = 'focus'";
$result = $manager->executeQuery($phql);
if ($result->success() == false) {
foreach ($result->getMessages() as $message) {
echo $message->getMessage();
}
}
通过监听phalcon的底层SQL生成,上述示例代码,会被解析成两个SQL语句:
select * from cars where name='focus';
#此处的id=1是根据上一条select返回记录的主键值
update cars set price=15000.00 where id=1
也就是说,PHQL底层在执行update语句时,会先根据条件查询相关记录,再根据相关记录的主键值去更新数据。
如果从查询优化的角度来说, 若是更新条件没有做索引处理,那必然会引起性能损耗。PHQL底层自动转化为以主键为更新条件,这也算是规避了这种风险。
但是从SQL执行的角度来看, 每一次更新操作,都需要执行两条SQL,这又算不算是另一种性能损耗了?
不知道这种处理方式算不算是一个坑 ?
推荐阅读
-
不应该使用的JS语法解析
-
全方位解析百度竞价数据分析中的几个疑问
-
SQL基础语法的单表操作 select|insert|update|delete(增删改查) 简单使用
-
JSP的基本语法解析
-
javaScript常见的输出语法解析
-
mysql中的update set select的sql语法实例讲解
-
Python 之父的解析器系列之五:左递归 PEG 语法
-
基于Predictive Parsing的ABNF语法分析器(3)——ABNF语法解析器的基本框架
-
SQL的JOIN语法解析之innerjoin,leftjoin,rightjoin,fullouterjoin的区别讲解
-
Python 之父的解析器系列之六:给 PEG 语法添加动作