减少复杂自定义应用程序中的数据库查询数量

Ell*_*llo 8 php mysql

我继承了一个用PHP编写的电子商务软件项目.当我检查代码库时,我在代码中发现了很多SQL语句.有很多类,如产品,类别,用户,客户等,每个类都有很多数据库查询.

我不知道如何处理这种情况,并决定计算单页访问的总查询数.我封装了MySQL查询功能并增加了一个计数器.

我对结果感到有些震惊.要单独访问索引页面,执行了1633(!)个MySQL选择查询.列出类别的产品会触发近2000个查询.

我将查询传输到文本文件中进行分析.超过90%是可能有一个或两个值的单选语句.现在我该怎么做来清理这个烂摊子?你有什么建议?我在MySQL服务器上启用了缓存.加载页面大约需要490毫秒.

其他细节

例如,有一个名为Product的类.在这个类中有8个单个小的SQL select语句.

当您现在打开类别列表以显示产品时,原始程序员使用一个select语句来获取所需产品的列表,然后为每个产品创建一个产品对象.

假设这个结果给了我们20个产品:

select id from products where price <= 10;
Run Code Online (Sandbox Code Playgroud)

然后他遍历结果并为每个条目创建一个产品对象:

$qresult = query("select id from products where price <= 10");
$products = array();
foreach ($qresult as $prod) {
  $products[] = new Product($prod['id']);
}
Run Code Online (Sandbox Code Playgroud)

仅此一项就可以为产品生成20*8个SQL查询.同样的方法也用于其他类(用户,客户,类别等).

前一段时间

现在,经过几周/几个月后,我想分享我到目前为止所做的解决方案.

我可以将查询减少到每页访问量<~50,并将页面加载时间减少到400毫秒以下.

我很容易做到了.我试图确定热点并构建一个表缓存类.每次访问此静态类都会将整个表内容加载到内存中,从现在开始,每个表请求都将从静态类中提取出内存.非常脏,不是很好,但它工作,更快,减少总查询和备件服务器硬件.

我想我们也会将硬件抛给这个问题,只要用户数量增加,就像现在一样.

如果我们要用另一个替换应用程序,我们肯定会寻求一个数据库查询 - 好的解决方案

谢谢大家的建议

acu*_*are 0

可能有一个(或多个)循环(foreach 或 while 等)为每次迭代调用 mysql_query。

一旦找到该循环,您就可以决定如何优化它 - 例如,您可以一次将所有记录加载到数组中,然后循环对数组进行操作,而不是每次都调用数据库。