Mysql 合并SQL语句及其如何影响处理时间

Mysql 合并SQL语句及其如何影响处理时间,mysql,sql,Mysql,Sql,假设我有以下表格: items table item_id|view_count item_views table view_id|item_id|ip_address|last_view 我想做的是: 如果给定ip地址下具有给定item_id的项目的最后一次查看时间是1个多小时前,我想增加items表中项目的view_计数。并因此获得项目的视图计数。我通常会如何做: q = SELECT count(*) FROM item_views WHERE item_id='item_id' AN

假设我有以下表格:

items table
item_id|view_count

item_views table
view_id|item_id|ip_address|last_view
我想做的是: 如果给定ip地址下具有给定item_id的项目的最后一次查看时间是1个多小时前,我想增加items表中项目的view_计数。并因此获得项目的视图计数。我通常会如何做:

q = SELECT count(*) FROM item_views WHERE item_id='item_id' AND ip_address='some_ip' AND last_view < current_time-60*60

if(q==1) then q = UPDATE items SET view_count = view_count+1 WHERE item_id='item_id'

//and finally get view_count of item
q = SELECT view_count FROM items WHERE item_id='item_id'
这里我使用了3个SQL查询。如何将其合并到一个SQL查询中?它如何影响处理时间?它会比以前的方法快还是慢

update target
    set target.view_count = target.view_count + 1
from items target
inner join (
    select item_id
    from item_views
    where item_id = 'item_id'
        and ip_address = 'some_ip'
        and last_view < current_time - 60*60
    ) ref
    on ref.item_id = target.item_id;
您只能使用连接将update语句与条件组合起来,如上例所示;但是您仍然需要一个单独的select语句。
在非常大的集合和/或未编制索引的表格上,速度可能较慢。

我认为您的逻辑与您描述的所需不符。查询:

SELECT count(*)
FROM item_views
WHERE item_id='item_id' AND
      ip_address='some_ip' AND
      last_view < current_time-60*60
如果q=0,则在下一行

MySQL的性能非常好,not exists的性能非常好,所以下面应该可以很好地工作: 更新项目 设置视图计数=视图计数+1 其中item\u id='item\u id'和 不存在选择1 从项目视图 其中item\u id='item\u id'和 ip地址='some\u ip'和 上次查看>当前时间-60*60

使用item_viewsitem_id、ip_address、last_view上的索引和item_id上的索引会更好

在MySQL脚本中,您可以编写:

. . .
     set view_count = (@q := view_count+1)
. . .

这也将为您提供所需的变量。

您是在尝试优化查询的性能,还是将它们简化为一条语句?优化性能
. . .
     set view_count = (@q := view_count+1)
. . .