优化ajax view-count sql命令以获得速度

时间:2013-01-04 15:21:31

标签: php sql ajax performance mysqli

我有一个Wordpress驱动的网站,我使用wp-super-cache,因此我被迫跟踪ajax而不是内联PHP的视图。以下是我的PHP文件的内容,它通过ajax调用。代码不是特定于Wordpress的btw,但为了解释一下,它更新了wp_postmeta表,就像update_post_meta()一样。它使用mysqli,并使 2 sql查询

  1. 确保要更新的postid有效。
  2. 增加观看次数。
  3. 我的问题是,此代码是否存在某些性能问题,是否会以某种方式更好?

    代码摘录:     

      #...ajax stuff
    
      $json_array = array();
      $json_array["category_id"] = (int)$cat_id;
      $json_array["post_id"] = (int)$post_id;
    
      // get secure database credentials
      require("/server/abspath/dbinfo.inc");
    
      $db_details = new dbCreds;
      $mysqli = new mysqli(
        $db_details->get("dbhost"),
        $db_details->get("dbuser"),
        $db_details->get("dbpw"),
        $db_details->get("db")
      );
    
      # test if valid post
      # sql call no1
      $valid_post_sql = "SELECT ABS(meta_value) FROM wp_postmeta "
        . "WHERE (post_id = '" . $post_id . "' AND meta_key = 'views')";
      $current_view_count = @$mysqli->query($valid_post_sql)->fetch_array();
      $valid_post_sql_result = $current_view_count ? true : false;
    
      if ( $valid_post_sql_result == false ) {
        die("4");
      }
    
      # set new view-count
      $views = isset($current_view_count[0]) && (int)$current_view_count[0] >= 0
        ? ((int)$current_view_count[0]+1) : 0;
    
      # if not an admin or no views recorded yet
      if ( !$is_admin || $views == 0 ) {
        # sql call no2
        $increment_imgviews_sql = "UPDATE wp_postmeta SET meta_value = "
          . "meta_value + 1 WHERE (post_id = '" . $post_id
          . "' AND meta_key = 'views')";
        $mysqli->query($increment_imgviews_sql);
      }
      $json_array["views"] = $views;
      return $json_array;
    

    新代码:

    这是我最终使用的,用这一个替换2个电话:

    UPDATE wp_postmeta SET meta_value = meta_value + 1 WHERE post_id = '" . $post_id . "' AND meta_key = 'views';

    注意!这使返回响应过时,因为我没有得到返回的当前视图计数。但另一方面,我保存了一个查询。

2 个答案:

答案 0 :(得分:1)

你不能使用INSERT ... ON DUPLICATE KEY结构而不是检索/更新/存储吗?现在你的代码相当活泼,可能会失去命中率。像

这样的东西
INSERT INTO wp_postmeta (meta_value, meta_key, post_id) VALUES (...)
ON DUPLICATE KEY UPDATE meta_value=meta_value+1

会消除这种怜悯。

答案 1 :(得分:1)

看起来对我很好。我唯一想说的是,如果这是一个后台任务,那么获取视图计数响应在生产环境中是没有用的(除非事情发生我不知道)。

所以鉴于这些信息,没有理由事先验证postid。您可以删除第一个sql语句以及$ views计算,​​并使用update语句(如果它不是有效的id,那么它根本不会更新任何东西)。如果您在创建帖子时未设置此“视图”元键,请查看INSERT... ON DUPLICATE KEY而不是更新

如果你真的想保留你的json响应,那么我看不到任何真正可以做出的改进。