当前位置: 代码迷 >> 综合 >> PHP 优化数据库查询
  详细解决方案

PHP 优化数据库查询

热度:53   发布时间:2024-01-31 19:43:21.0

php+mysql 开发的后端项目中,速度上的瓶颈基本锁定在 mysql查询上,本节主要记录页面或接口慢的部分场景以及优化方式

场景一:分页查询 + 销量统计

常规的不考虑性能的写法:

<?php 
// $pdo 为pdo数据库链接实例
$sql = "SELECT id, name, *** FROM goods WHERE *** limit 10,10";
$data = $pdo->query($sql);foreach ($data as $k => $v) {$goods_id = $v['id'];$sql = "SELECT COUNT(*) as count FROM order WHERE goods_id={$goods_id}";$count = $pdo->query($sql); //商品销量//....
}

可以看到,如果分页,一页查询10条的话,这一个分页功能,将会查询11次数据库,比较耗时,下面对其优化

<?php 
// $pdo 为pdo数据库链接实例
$sql = "SELECT id, name, *** FROM goods WHERE *** limit 10,10";
$data = $pdo->query($sql);//拿出列表数据中的商品id数据
$goods_ids = array_column($data, 'id');//得到id组成的新数组[1, 2, 3, 5...]$goods_ids_str = implode(',', $goods_ids);
//集中查询
$sql = "SELECT goods_id, COUNT(*) as count FROM order WHERE goods_id in ({$goods_ids_str }) GROUP BY goods_id";
$sales_data = $pdo->query($sql);
//将二维数据数组降维
$sales_data = array_column($sales_data, 'goods_id', 'count');foreach ($data as $k => $v) {$goods_id = $v['id'];$count = isset($sales_data[$goods_id]) ? $sales_data[$goods_id] : 0; //商品销量//....
}

显然利用数组的内置函数 array_column 可以将数据库查询缩小为两次查询!

  相关解决方案