我正在尝试使用PHP处理消息树的一些代码更高效。数据存储在SQL数据库中,目前每条消息需要进行2次SQL查询,一次查找数据,另一次查看数据。我想我有办法用一个查询完成这个,但它使用的游标我听说比其他SQL方法慢得多。
有没有人知道使用游标执行一个SQL查询是否仍然更有效,或者更好地坚持使用每个消息使用select和更新查询的当前方法和PHP将查询绑定在一起?
答案 0 :(得分:3)
同意@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服务器的网络开销。
说了这么多 - 在大多数情况下,你不会注意到现实场景中的差异。此外,值得指出的是,如果您的数据库负载很重,或者您的查询执行缓慢(例如,通过迭代具有数百万条记录的游标),这种方法可能会产生数据库服务器瓶颈。从广义上讲,如果可能的话,您希望避免在数据库上长时间运行的作业 - 最好将它们分成许多小作业。