我正在努力使一些代码更有效地处理 PHP 中的消息树。数据存储在 SQL 数据库中,目前每条消息要执行 2 次 SQL 查询,一次查找数据,一次更新数据。我想我有办法通过单个查询来完成这项工作,但它使用的游标我听说比其他 SQL 方法慢得多。
有谁知道执行一个使用游标的 SQL 查询是否仍然更有效,还是坚持使用当前方法更好,该方法使用每条消息的选择和更新查询以及 PHP 将查询绑定在一起?
我正在努力使一些代码更有效地处理 PHP 中的消息树。数据存储在 SQL 数据库中,目前每条消息要执行 2 次 SQL 查询,一次查找数据,一次更新数据。我想我有办法通过单个查询来完成这项工作,但它使用的游标我听说比其他 SQL 方法慢得多。
有谁知道执行一个使用游标的 SQL 查询是否仍然更有效,还是坚持使用当前方法更好,该方法使用每条消息的选择和更新查询以及 PHP 将查询绑定在一起?
同意@Catcall - 没有看到代码,很难有意义地回答这个问题。
但是,从广义上讲,人们经常说游标比其他 SQL 方法慢的原因是一些开发人员在基于集合的操作可以工作的地方使用游标。
例如,如果您的计划是(在伪代码中,在没有实际数据库引擎或模式的情况下)
create cursor RecordsToUpdate
as
select *
from UserTable
where name like 'Codd%'
foreachRecord in RecordsToUpdate
set record.lastUpdatedDate = today
next
(希望)很明显,您可以通过执行
update UserTable
set lastUpdatedDate = today
where name like 'Codd%'
但是,在某些情况下,基于集合的操作是不可能的,然后 - 再一次,从广义上讲 - 创建游标、执行逻辑和关闭游标会更有效 - 最好是在存储过程或其他东西中. 这种方法限制了将数据发送回 PHP 服务器的网络开销。
说了这么多——在大多数情况下,您不会注意到现实场景中的差异。此外,值得指出的是,如果您的数据库负载很重,或者您的查询执行缓慢(例如,通过迭代具有数百万条记录的游标),这种方法可能会造成数据库服务器瓶颈。从广义上讲,如果可能的话,您希望避免在数据库上长时间运行作业 - 最好将它们分成许多小作业。