【发布时间】:2022-01-28 19:59:18
【问题描述】:
我正在尝试优化 MariaDb 中的一个查询,该查询确实被其 ORDER BY 子句所困扰。如果没有 ORDER BY 子句,我可以在不到十分之一秒的时间内运行它,但使用它需要超过 25 秒。以下是查询的要点:
SELECT u.id, u.display_name, u.cell_phone, u.email,
uv.year, uv.make, uv.model, uv.id AS user_vehicle_id
FROM users u
LEFT JOIN user_vehicles uv ON uv.user_id = u.id AND uv.current_owner=1
WHERE u.is_deleted = 0
GROUP BY u.id
ORDER BY u.display_name
LIMIT 0, 10;
- 我需要它是左连接,因为我想包含未链接到车辆的用户。
- 我需要 group by,因为我只希望每个用户有 1 个结果(并且不能保证 display_name 是唯一的)。
- users 表大约有 130K 行,而 user_vehicles 大约有 230K 行。
这里是查询的解释:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE u index dms_cust_idx PRIMARY 4 null 124825 Using where; Using temporary; Using filesort
1 SIMPLE uv ref user_idx user_idx 4 awscheduler.u.id 1 Using where
我已经尝试了这两个索引来加快速度,但它们似乎没有多大作用。
CREATE INDEX idx_display_speedy ON users(display_name);
CREATE INDEX idx_display_speedy2 ON users(id, display_name, is_deleted, dms_cust_id);
我正在寻找有关如何加快速度的想法。我尝试使用嵌套查询,但由于顺序是瓶颈,嵌套查询中的顺序被忽略,我相信这种尝试是徒劳的。
【问题讨论】:
-
查询后排序结果有一个技巧。答案已经存在,请查看Slow query when using order by。
标签: performance mariadb sql-order-by