【问题标题】:Is it more efficient to make only one query and store it in an array or make a query every time?只进行一次查询并将其存储在数组中还是每次都进行查询更有效?
【发布时间】:2019-09-15 03:30:06
【问题描述】:

我想知道什么更有效,只进行一次查询并将结果存储在一个数组中,然后使用 PHP 中的 in_array 函数检查这个数组,或者每次我需要检查值时进行 MySQL 查询?

例如: 我创建了这个函数来将查询存储在一个数组中,所以这个查询只会进行一次。

 private function carregaPermissoes(){
        $query = mysql_query("SELECT permissao_nome FROM sisgrupopermissoes WHERE id_grupo = ".$this->getGid().";");
        if (mysql_num_rows($query) > 0){
            $array_permissoes = array();
            while ($row = mysql_fetch_array($query)){
                array_push($array_permissoes, $row["permissao_nome"]);
            }
            return $array_permissoes;
        }
    }

然后每次我需要检查它时,我就使用这个功能:

public function checkPermissao($permissao){
        $this->setPermissao($permissao);
        if (in_array($this->getPermissao(), $this->getGrupoPermissao())){
            return true;
        }else{
            return false;
        }
    }

这是一个好方法吗?还是每次我需要检查时都进行查询?

【问题讨论】:

  • 一般来说,除非您需要最新信息,否则到数据库的往返次数越少越好。请注意,您使用的是过时、不安全且已弃用的 API。
  • 同意@Strawberry。如果您想在特定情况下确定答案,请以两种方式编写,并衡量性能。 stackoverflow.com/a/1202746/350538

标签: php mysql arrays


【解决方案1】:

SQL 查询,通常是最常见的瓶颈 网络。您的功能可以简化为:

public function checkPermissao($permissao)
{
    // The following line smells...
    $this->setPermissao($permissao);
    return in_array($this->getPermissao(), $this->getGrupoPermissao());
}

如果您担心in_array 引入的开销(本质上使用顺序搜索),您可以flip haystack 数组并改用array_key_exists

【讨论】:

    【解决方案2】:

    您将权限存储在一个数组中并在里面检查。如果有人/管理员更改了权限,此时您的数组中有旧权限怎么办,据我了解,这不是使用数组的好习惯。

    你可以像这样执行查询

    $query = mysql_query("SELECT permissao_nome FROM sisgrupopermissoes WHERE id_grupo = ".$this->getGid()." AND permissao_nome='".$this->getPermissao()."'"); 
    

    并使用 mysql_num_rows 检查条件

    return mysql_num_rows($query)  
    

    【讨论】:

    • 不要使用 mysql_ 任何东西。从来没有!
    • @Strawberry 好点,但 OP 询问最佳方法,它不打算使用 MySQL
    猜你喜欢
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多