我对数据库进行查询时遇到了一个缓慢的问题,它来自朋友的网站,我对php不太了解,但是进行查询的部分是以下代码。
function get($id_usuario=false){
global $wpdb;
if($id_usuario){
$tabla = $wpdb->prefix."mod_usuarios";
$consulta = "Select * from $tabla where id_usuario='$id_usuario' ";
$resultado = $wpdb->get_results($consulta);
foreach($resultado as $fila){
$clCliente = new acClientes();
$clCliente->formateaSalida($fila);
}
return $clCliente;
}
else{
$tabla = $wpdb->prefix."mod_usuarios";
$consulta = "Select * from $tabla ";
$resultados = $wpdb->get_results($consulta);
$array = array();
$i=0;
foreach($resultados as $fila){
$array[$i] = new acClientes();
$array[$i]->formateaSalida($fila);
$i++;
}
return $array;
}
大约有 900 条记录(和 6 个字段),当我使用 Select * from wp_mod_usuarios
它查询数据库时不到半秒。但是,如果我使用上面的代码这样做,则需要超过 20 秒。
我不知道问题出在哪里,我一直在阅读,使用 php 与通过 phpmyadmin 进行操作不一样,但差别很大吗?
提前致谢
有几个因素会导致代码变慢。
请注意,我说的是code而不是query,因为有时问题可能不是查询。
但是,您的 SQL 语句没有经过优化。
SELECT *
除非您要使用表的所有字段或列。让我们想象一个有 20、40、50、100 列的表,在给定的查询中你id, nombre, apellidos ...
只SELECT *
需要,您将不必要地选择此时您不会操作的 47 列。所以:第一条优化规则,不,不,不是SELECT *
EXPLAIN SELECT columna1, column3, solocolumnaquenecesites FROM tabla WHERE ...
起初看起来很复杂,但通过EXPLAIN
您将很快看到表的索引是如何工作的。花一点时间在上面是值得的。在这个问题及其答案中,您将能够EXPLAIN
清楚地了解操作。它是优化我们表格的绝佳盟友。当我谈到索引时我不仅指主键和外键,还指唯一索引。例如,当索引错误时EXPLAIN
,它会告诉您,您的查询不是读取 1、2、5... 行,而是读取 900 或 10,000 或几百万行,尤其是当您通过JOIN
SQL 语句连接多个表时。(这里不是这样,但我认为值得指出。)与查询数据库无关的代码的另一部分。可能是优化问题在处理已经获得的数据的代码方面,在这种情况下是函数:
或者也在这里:
事实证明,PDO 有方法以数组(或许多其他方式)返回我们的结果集。这是我在操作系统代码中经常看到的另一个错误,我的意思是我看到代码重新发明轮子,试图做一些数据库管理驱动程序已经通过他们自己的方法做的事情,但有时收效甚微。
PS:
如果你决定使用 PDO ,这里有一个现成的类(虽然我还没有改进它),它将为你提供安全查询和处理数据的基本功能。
我不知道问题可能出在哪里,但我添加了一些改进:
关于您的产量问题,我会打赌第 3 点或与您的全球声明相关的内容。
问候。