MySQL:提高子选择查询的效率
问题描述:
我有一组(MySQL)表,如下所示。我需要根据匹配的型号/序列号检索问题单的列表,以及任一设备表中匹配设备的编号。MySQL:提高子选择查询的效率
注意,型号/序列号组合应该是在两个设备表中的唯一,但是型号/序列号输入框是*的形式,所以有用户可以输入相同的型号/序列两次的可能性。在这种情况下,检索哪个设备单元并不重要,但是仅应按每张票返回结果,因为我们显示的是票证列表,而不是设备。
'门票'[工单表]
- ID [指数]
- 模型[设备型号]
- 串行[设备序列号]
- ...等
user_equipment [用户设备表]
- ID [指数]
- 模型[设备型号]
- 串行[设备序列号]
- ...等
site_equipment [现场设备]
- ID [指数]
- 型号[设备型号]
- 系列[设备序列号]
- ...等
目前我使用子查询返回的用户和现场设备的ID,但性能很差:
SELECT tickets.*, ... other tables/columns here,
(SELECT id FROM user_equipment WHERE model = tickets.model AND serial = tickets.serial LIMIT 1) as user_equipment_id,
(SELECT id FROM site_equipment WHERE model = tickets.model AND serial = site_equipment.serial LIMIT 1) as site_equipment_id
FROM
tickets
... other joins here
WHERE ...
HAVING ...
ORDER BY ...
LIMIT ...
我将不胜感激任何改善此查询性能的建议。不幸的是,由于许多其他依赖关系,更改表结构不是一种选择。
谢谢!
答
你想在指标:
user_equipment(model, serial, id)
site_equipment(model, serial, id)
前两列可以按任意顺序。
所以你说现有的查询是好的,有没有更好的方式来实现这一目标? –
好吧,我添加了索引,并且我被性能改进所打动!最初耗时5-8秒的查询现在需要0.5秒!谢谢! –
为了澄清,这是编写这种查询类型的最佳方法吗?我看到一些使用LEFT JOIN和GROUP BY语句的人,但是这增加了一些复杂性和问题,因为我需要返回多个连接表中的许多/所有字段。 –