mysql/php-如何实现独特的视图系统?

mysql/php-如何实现独特的视图系统?,php,mysql,Php,Mysql,导言 我想知道什么是实现独特视图系统的最佳方式。。。我想我知道怎么做,所以如果我能解释一下我是怎么做的,你可以指出任何错误或改进 显然,我必须存储一个日志表,其中包含一个视频id和(相对地)唯一标识用户的内容。起初,我考虑了头请求和IP的组合,但决定保持简单,只使用IP。同样,用户不能通过使用不同的浏览器来增加视频的浏览量 我会这样想: 当用户访问时,我进行选择 与此类似: 从tbl_日志中选择1,其中IP= $usersip和video\u id=$video\u id 如果没有结果,那么我

导言

我想知道什么是实现独特视图系统的最佳方式。。。我想我知道怎么做,所以如果我能解释一下我是怎么做的,你可以指出任何错误或改进

显然,我必须存储一个日志表,其中包含一个视频id和(相对地)唯一标识用户的内容。起初,我考虑了头请求和IP的组合,但决定保持简单,只使用IP。同样,用户不能通过使用不同的浏览器来增加视频的浏览量

我会这样想:

  • 当用户访问时,我进行选择 与此类似:

    从tbl_日志中选择1,其中IP=
    $usersip和video\u id=$video\u id

    • 如果没有结果,那么我必须 插入记录
    插入tbl_日志(IP、视频id)
    值($usersip,$video\u id)

    • 并将视图增加1
    从tbl_视频中选择视图,其中
    video\u id=$video\u id

    更新tbl\u视频集视图=
    $result['views']+1,其中视频id
    =$video\u id

  • 问题

    • 我想我不想拥有
      数以百万计的日志记录速度减慢 我的网站,那么我应该运行cron作业来 每天清空日志表一次

    • 我应该发表意见吗
      交易的(我想有点
      折旧的视图计数小于
      重要的比一个缓慢的网站,因为 行锁)

    • 有没有办法减少机器的负载 mysql服务器。。。。我担心如果每个人 视图需要增加视图计数 和一个IP日志,它将是美丽的 昂贵的。我已经在youtube上看过了
      等不更新视图 立刻。。。他们是否缓存了
      更新一些方法,然后在 一旦如果是,怎么做

    • 我的系统有多高效?你能 有什么改进吗


      • 以下是一些您可以改进的想法

        将tbl_日志上的主键设置为IP+video_id。然后您只需执行

         REPLACE INTO tbl_log (IP,video_id) VALUES ($usersip, $video_id)
        
        (确保转义这些php变量以避免SQL注入。)

        现在,您只使用一个查询更新日志表。接下来,您可以使用以下内容定期更新tbl_视频中的视图字段:

        UPDATE tbl_video SET views = (select count(*) from tbl_log where video_id = $video_id) where video_id = $video_id
        
        您可以通过cron作业来实现这一点,也可以添加“last_count_update”字段,并在访问视频时更新视频(如果上次计数时间超过2小时或其他时间)。如果你有一大堆不常被访问的视频,那么这项工作就会少一点

        我想我不想有 数以百万计的日志记录减慢了我的站点速度,所以我应该运行cron吗 每天清空日志表一次的作业

        考虑使用mysql的ON-DUPLICATE-KEY-UPDATE语法来避免使用SELECT,因为SELECT会有一个昂贵的WHERE子句。如果日志表也有时间戳列,则可以刷新该值

        INSERT into tbl_log (IP,video_id) VALUES ($usersip, $video_id) ON DUPLICATE KEY UPDATE time_recorded = now();
        
        这将要求您对
        IP
        video\u id
        列具有唯一的约束

        我应该使视图具有事务性吗? (我想这是一个稍微被低估的观点 计数不如慢计数重要 由于行锁定而导致的站点错误)

        不,因为您可以通过单个UDPATE查询实现这一点

        UPDATE tbl_video SET views = views + 1 WHERE video_id = $video_id
        
        有没有办法减少机器的负载 mysql服务器。。。。我担心如果每个人 视图需要增加视图计数 和一个IP日志,它将是美丽的 昂贵的。我在youtube上看过 等不更新视图 立刻。。。他们是否缓存更新 有些人是如何做到这一点的?如果 那怎么办

        这还不算太糟——确实没有其他方法可以可靠地捕获记录视图数据。在Youtube的例子中,更可能是延迟写入或复制导致了您注意到的延迟,因为它们有数百台服务器(尽管它们可能也在缓存值)

        我的系统有多高效?你能 有什么改进吗


        除了我在这里已经提到的以外,这不是我脑子里想的。

        你的两个建议都很有道理,我认为第二个建议的唯一问题是它没有清除日志。。。因此,每次执行时,它都会对结果进行计数,无论它们是否已被计数。我想我有两个选择。。。使日志的寿命等于视图更新时的寿命(通过在计算视图时清空日志),或通过添加计数字段来停止多次计算日志。你认为呢?是的,不管结果是否被计算过,它都会计算结果。但它不会将该计数添加到现有计数中,而是替换现有计数。如果清除日志表,我看不到任何方法可以保证视图的唯一性。你要么要住在一张大桌子旁,要么要改变你对“独一无二”的定义。例如,如果您确定每个IP和每天或每周的唯一平均数,那么您可以在统计前一天/周(或更早)的记录后清除该表中的所有记录。但是,您必须处理添加它们,而不是替换计数。然后你需要像你提到的计数字段一样的东西。是的。。。但我真的想要永恒的记录来确保独特的视图吗?当然,每天都要检查用户是否访问过,计数的时间会越来越长吗?在我看来,唯一的观点并不是对个人进行计数(因为很多用户在工作/学校的路由器后面是不正确的)还有更多关于停止人们反复按刷新以增加他们的浏览量的信息…对不起,我不明白你的第一个建议。。。重复密钥更新如何意味着我不必清空日志?你的意思是说执行SQL会更快,因为没有WHERE,因此我不必清空日志?