mysql - 在大 View 上优化 MySQL GROUP BY 或 DISTINCT

标签 mysql optimization group-by distinct performance

考虑一个由多个表组成的 View ...例如 v_active_car,它由连接到 body 的表 car 组成>、enginewheelsstereo。它可能看起来像这样:

v_active_cars View

SELECT * FROM car
    INNER JOIN body ON car.body = body.body_id
    INNER JOIN engine ON car.engine = engine.engine_id
    INNER JOIN wheels ON car.wheels = wheels.wheels_id
    INNER JOIN stereo ON car.stereo = stereo.stereo_id
    WHERE car.active = 1
    AND engine.active = 1
    AND wheels.active = 1
    AND stereo.active = 1

汽车的每个部件都有一个“事件”标志。 现在,我需要找到现役汽车中可用的所有音响。 为此,需要使用整个 View ,而不仅仅是 stereo 表 - 立体声处于事件状态并不意味着它在汽车中可用。

我能做到

SELECT DISTINCT stereo_id FROM v_active_cars

尽管这可能会返回非常少量的行,但它仍然是一个非常慢的查询。

我已经试过了,但它更慢:

SELECT stereo_id FROM stereo WHERE EXISTS
(SELECT 1 FROM v_active_cars WHERE stereo_id = stereo.stereo_id)

我还能做些什么来加快速度吗?

最佳答案

  1. 确保所有的 JOIN 都有索引
    • 在您的例子中,每个级别都由一个键和一个标志选择。添加标志作为索引的一部分可能允许数据库仅使用索引,而不是读取整个记录
    • 确保您有足够的 RAM 来保存结果集。特别是 InnoDB 表有很多你必须调整的旋钮。大多数默认设置都假定非常硬件和太小的 RAM。

关于mysql - 在大 View 上优化 MySQL GROUP BY 或 DISTINCT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/533219/

相关文章:

php - 如何使用php将多个图像上传到mysql数据库

php - 我如何将两行中的值合并为一行

c++ - 绘制许多四边形

python - Pandas:使用 group by,将多个列值组合为 groupby 中的一个不同组

sql - 为什么我需要在 SQL "GROUP BY"子句中明确指定所有列 - 为什么不是 "GROUP BY *"?

mysql - 对于长位串,最有效的 MySQL 数据类型是什么?

python - 即使在提交更改后,MySQL-python 连接也看不到在另一个连接上对数据库所做的更改

swift - 字符串消耗大量内存

mysql - 优化表的简单更新

MySQL Grouping 使用 group_concat 然后 Group BY