mysql - Laravel - 如何优化 MIN - MAX - orderBy 查询?
问题描述
我在 Laravel 中的代码是:
Car::selectRaw('*,
MIN(car_prices.price) AS min_price,
MAX(car_prices.price) AS max_price,
MAX(car_prices.updated_at) AS latest_update')
->leftJoin('car_prices', 'car_prices.car_id', 'cars.id')
->groupBy('car_prices.car_id')
->orderBy('latest_update', 'desc')
->paginate(10);
在抛出错误之前需要很长时间才能运行:
超过 60 秒的最大执行时间
表中的记录数cars
为 100,000 和 6,000,000 car_prices
。
表结构:
CREATE TABLE `cars` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=110001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
CREATE TABLE `car_prices` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`car_id` bigint(20) unsigned NOT NULL,
`price` decimal(8,2) NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `car_prices_car_id_foreign` (`car_id`)
) ENGINE=MyISAM AUTO_INCREMENT=5506827 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
查询:
select count(*) as aggregate
from `cars`
left join `car_prices`
on `car_prices`.`car_id` = `cars`.`id`
group by `car_prices`.`car_id`;
select *,
MIN(car_prices.price) AS min_price,
MAX(car_prices.price) AS max_price,
MAX(car_prices.updated_at) AS latest_update from `cars`
left join `car_prices`
on `car_prices`.`car_id` = `cars`.`id`
group by `car_prices`.`car_id`
order by `latest_update` desc
limit 10
offset 0;
我该如何优化它?我应该缓存数据吗?还是有比这更好的查询?
- 我的硬盘是SSD
- innodb_flush_log_at_trx_commit 的值 = 1
- 从上午 10 点到下午 2 点,写入/插入的数量大约为 1000/秒,在此期间之前和之后的请求要少得多。
解决方案
您使用的查询不适用于如此大的表。相反,每当进入表car_prices的条目设置操作并获取最小值和最大值并将其存储在汽车表中时。或者你可以为此设置一个crone。
推荐阅读
- reactjs - 无法解析“../../theme.config”
- combobox - 如何在后面的代码中访问 ComboBox 选定项
- javascript - Ajax 下载 gzip 文件 - 响应数据始终为字符串
- weblogic - cfgfwk-64254 在创建新域时执行安全处理阶段出错
- java - 如何创建ExpensiveGraph
- react-native - 在反应原生视频中添加字幕
- java - 如何在 Obsever Pattern 中处理多个 Observable 属性?
- java - Kafka 流,分支输出到多个主题
- github - 如何解决说找不到存储库的问题?
- c++ - 在单继承的情况下,强制转换何时返回不同的指针?