我继承了一个用 PHP 编写的电子商务软件项目。当我检查代码库时,我在代码中发现了很多 SQL 语句。有很多类,如 Product、Category、User、Customer 等,每个类都有很多数据库查询。
我不知道如何处理这种情况,决定统计单页访问的总查询数。我封装了MySQL的查询功能,增加了一个计数器。
我对这个结果有点震惊。仅访问索引页,执行了 1633 个(!)MySQL 选择查询。列出一个类别的产品触发了近 2000 个查询。
我将查询输入到一个文本文件中进行分析。超过 90% 是可能只有一个或两个值的单选语句。现在我应该怎么做才能清理这个烂摊子?你有什么建议?我在 MySQL 服务器上启用了缓存。加载页面大约需要 490 毫秒。
附加细节
例如,有一个名为 Product 的类。在这个类中有 8 个单独的小 SQL 选择语句。
当您现在打开类别列表以显示产品时,最初的程序员使用一个 select 语句来获取所需产品的列表,然后为每个产品创建一个产品对象。
假设这个结果为我们提供了 20 种产品:
select id from products where price <= 10;
然后他遍历结果并为每个条目创建一个产品对象:
$qresult = query("select id from products where price <= 10");
$products = array();
foreach ($qresult as $prod) {
$products[] = new Product($prod['id']);
}
仅此一项就为产品生成 20 * 8 个 SQL 查询。同样的方法也用于其他类(用户、客户、类别等)。
前一段时间
现在,几周/几个月过去了,我想分享我到目前为止所做的解决方案。
我可以将查询减少到每次页面访问 < ~50 次,并将页面加载时间减少到 400 毫秒以下。
我很容易做到了。我试图识别热点并建立一个表缓存类。每次访问此静态类都会将整个表内容加载到内存中,并且从现在开始的每个表请求都将从静态类的内存中提供出来。嗯,很脏,不是很好,但它可以工作,更快,减少总查询并节省服务器硬件。
我想我们也会把硬件扔到这个问题上,只要用户数量像现在这样增加。
如果我们到了用另一个替换应用程序的地步,我们肯定会选择一个数据库查询很好的解决方案
谢谢大家的建议