哪个更快/更高效 - 很多小MySQL查询或一个大PHP数组?

Pan*_*end 9 php mysql arrays performance

我有一个基于PHP/MySQL的Web应用程序,它通过带有string_id,lang_id,lang_text字段的MySQL表"language_strings"提供多种语言支持.然后,当我需要以所选语言显示字符串时,我调用以下函数...

public function get_lang_string($string_id,$lang_id) {
    $db=new Database();     
    $sql=sprintf("SELECT lang_string FROM language_strings WHERE lang_id IN (1, %s) AND string_id=%s ORDER BY lang_id DESC LIMIT 1", $db->escape($lang_id, "int"), $db->escape($string_id,"int"));
    $row=$db->query_first($sql);
    return $row['lang_string'];
} 
Run Code Online (Sandbox Code Playgroud)

这很好用,但我担心可能会有很多数据库查询.例如,主菜单有5个链接文本,所有这些都调用此功能.

将选定的lang_id的整个language_strings表结果加载到PHP数组然后从函数中调用它会更快吗?可能这将是一个巨大的阵列,其中大部分是多余的,但显然它将是每页面加载而不是很多的一个数据库查询.

任何人都可以提出另一种更有效的方法吗?

Flu*_*feh 7

没有一个不区分大小写的答案.你可以在个案陈述中真正看一下它.话虽如此,大多数时候,在一个查询中获取所有数据,将其弹出到数组或对象并从那里引用它会更快.

需要注意的是,您是否可以像运行五个单独的查询一样快速地在一个查询中提取所需的所有数据.这就是查询本身的性能发挥作用的地方.

有时,包含子查询或两个子查询的查询实际上比单独运行一些查询的时间效率更低.

我的建议是测试一下.获取一个查询,获取所需的所有数据,查看执行所需的时间.为其他五个查询计算时间并查看它们合并的时间.如果它几乎相同,则将输出粘贴到一个数组中,由于不必频繁连接数据库本身,因此效率更高.

但是,如果您的组合查询返回数据需要更长时间(例如,它可能会导致全表扫描而不是使用索引),那么请坚持使用单个查询.

最后,如果要反复使用相同的数据 - 数组或对象每次都会赢得访问权限,因为访问它将比从数据库获取数据快得多.


Pan*_*end 6

好的 - 我做了一些基准测试,并惊讶地发现将事物放入数组而不是使用单独的查询平均慢 10-15%。

我认为这样做的原因是,即使我过滤掉了“不常见”的元素,不可避免地总会有未使用的元素。

通过单独的查询,我只能得到我需要的内容,并且由于查询如此简单,我认为我最好坚持使用这种方法。

这对我来说很有效,当然在其他个别查询更复杂的情况下,我认为将公共数据存储在数组中的方法会更有效。