【发布时间】:2020-08-30 19:49:04
【问题描述】:
我开发了一个Laravel 应用程序,它带有从mysql db 加载数据的api 路由,控制器动作执行一个嵌套的数据库查询并返回一个集合;默认情况下,Laravel 将返回的集合转换为 JSON,下面是我的控制器操作:
public function index()
{
$admin0 = 2;
return DB::table('commodities_monthly_prices as CMP')
->join('locations', 'CMP.location_id', '=', 'locations.id')
->where('locations.admin0', $admin0)
->join('global_admins', 'locations.admin0', '=', 'global_admins.admin0_code')
->join('commodities', 'CMP.commodity_id', '=', 'commodities.id')
->join('price_types', 'CMP.price_type_id', '=', 'price_types.id')
->join('measure_units', 'CMP.measure_unit_id', '=', 'measure_units.id')
->select('commodities.name AS commodity_name', 'price_types.name AS type_name',
'measure_units.name AS unit_name', 'global_admins.admin0_code AS admin0',
'global_admins.admin0_name AS country_name', 'global_admins.admin1_code AS admin1',
'global_admins.admin1_name AS governorate_name')
->selectRaw('date(concat_WS(\'-\', CMP.price_year, CMP.price_month, \'01\')) as date, ROUND(AVG(CMP.price) / 1000, 3) as price')
->groupBy('date', 'commodity_name', 'type_name', 'unit_name', 'global_admins.admin0_name',
'global_admins.admin0_code', 'global_admins.admin1_name', 'global_admins.admin1_code')
->orderBy('date')
->orderBy('commodity_name')
->get();
}
返回的 JSON 对象数量超过 50000 个对象,大约需要 90 秒才能完成加载,我唯一想到的是将响应从 JSON 更改为 CSV(这会有所帮助),因为前端库接受 JSON和 CSV http 响应,如果这有帮助,请告诉我该怎么做?如果我需要第三方库?
请告诉我如何使动作加载更快。
感谢您的帮助,
SELECT `commodities`.`name` AS `commodity_name`,
`price_types`.`name` AS `type_name`,
`measure_units`.`name` AS `unit_name`,
`global_admins`.`admin0_code` AS `admin0`,
`global_admins`.`admin0_name` AS `country_name`,
`global_admins`.`admin1_code` AS `admin1`,
`global_admins`.`admin1_name` AS `governorate_name`,
ROUND(AVG(CMP.price) / 1000, 3) AS price
FROM `commodities_monthly_prices` AS `CMP`
INNER JOIN `locations` ON `CMP`.`location_id` = `locations`.`id`
INNER JOIN `global_admins` ON `locations`.`admin0` = `global_admins`.`admin0_code`
INNER JOIN `commodities` ON `CMP`.`commodity_id` = `commodities`.`id`
INNER JOIN `price_types` ON `CMP`.`price_type_id` = `price_types`.`id`
INNER JOIN `measure_units` ON `CMP`.`measure_unit_id` = `measure_units`.`id`
WHERE `locations`.`admin0` = ?
GROUP BY `CMP`.`price_year`,
`CMP`.`price_month`,
`commodity_name`,
`type_name`,
`unit_name`,
`global_admins`.`admin0_name`,
`global_admins`.`admin0_code`,
`global_admins`.`admin1_name`,
`global_admins`.`admin1_code`
ORDER BY `commodity_name` ASC
【问题讨论】:
-
优化/索引您的数据库?使用分页返回 500 而不是 50000?
-
获取原始查询。包括
EXPLAIN {query}和SHOW CREATE TABLE {tablename}用于涉及的表。 -
而不是
group by date,使用groupBy CMP.price_year, CMP.price_month -
我不能在前端使用分页,因为我使用的是
PivotTable.jspivottable.js.org/examples,它需要所有记录来进行分析; -
@danblack 这是一个
gist包含表格和原始查询:gist.github.com/yabasha/d36acf539f32af70b72f394b8e45404a 谢谢你的帮助,
标签: mysql laravel performance api