只进行一次查询并将其存储在数组中还是每次都进行查询更有效?

Posted

技术标签:

【中文标题】只进行一次查询并将其存储在数组中还是每次都进行查询更有效?【英文标题】: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。如果您想在特定情况下确定答案,请以两种方式编写,并衡量性能。 ***.com/a/1202746/350538 【参考方案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

以上是关于只进行一次查询并将其存储在数组中还是每次都进行查询更有效?的主要内容,如果未能解决你的问题,请参考以下文章

text 在Tinker中进行自定义查询并将其传递给数组

Python-Sqlalchemy-Postgres:如何将子查询结果存储在变量中并将其用于主查询

Presto 无法查询配置单元表

如何存储数十亿 JSON 文件并进行查询

如何在DynamoDB中访问关系数据(键与查询)

我应该将消息存储在我的数据库中还是每次都查询系统 SMS 数据库?