加速(无法访问)MySQL查询

时间:2017-04-28 19:39:35

标签: php performance mysqli

我有一些PHP会话测试代码 - 以确保登录用户有效。 我只是解释一些函数:is_logged_in只是检查是否设置了一些会话变量并且test_duplicate连接到数据库以检查是否有一行的列等于该值

function check_account(){
  if(is_logged_in()){
    // Destroy session if the user doesn't exist.
    if(test_duplicate("username", $_SESSION["user"])){
      session_destroy();
    }
  }

  if($_SESSION["valid_day"] != date("Ymd")){
    // Destroy session if the key has expired
    session_destroy();
  }
}



function test_duplicate($field, $value){
  $mysqli = database_connect();
  $statement = $mysqli->prepare("SELECT * FROM users WHERE " . $field . " = ?");
  $statement->bind_param("s", $value);
  $statement->execute();
  $statement->store_result();

  $rows = $statement->num_rows;
  if($rows > 0){
    return FALSE;
  }

  return TRUE;
}

function database_connect(){
  if(!isset($dbconnection)){
    $config = get_configuration();

    // Create connection
    $mysqli = new mysqli($config["hostname"], $config["username"], $config["password"], $config["database"]);

    if($mysqli->connect_error){
      die("<h1>Error 1 :: Critical backend failure</h1>");
    }

    if(!check_tables($mysqli)){
      die("<h1>Error 2 :: Critical backend failure</h1>");
    }

    $dbconnection = $mysqli;

    return $mysqli;
  }else{
    return $dbconnection;
  }
}

问题:

  • test_duplicate功能大约需要3-4秒才能完成
  • 缓存无法正常工作,因为我需要测试该值(它确定用户是否仍然存在于数据库中)

我目前的解决方案(我不认为这些特别好):

  • 仅随机运行代码(即1/5机会)
  • 没有运行代码(但我不确定如何实现此代码)

1 个答案:

答案 0 :(得分:2)

我建议:

  1. 添加调试代码以衡量def seq(n): return reduce(lambda x,y: 10*x+y, [1]*n)**2/10**(n-1) 函数中每行代码所需的时间。
  2. 缓存连接并在@jeroen之类的组件中分享,在评论中建议。
  3. 不是选择test_duplicate的所有字段,而是返回单个整数值。更好的是,它不是将它作为一个行返回查询,而是将它作为一个返回单个值的标量查询。
  4. <强>更新

    如果select *中有一个具有指定值的行,则返回1;如果不存在匹配的行,则为0;

    username