2017-11-25 79 views
0

我有一组(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 ... 

我将不胜感激任何改善此查询性能的建议。不幸的是,由于许多其他依赖关系,更改表结构不是一种选择。

谢谢!

回答

2

你想在指标:

  • user_equipment(model, serial, id)
  • site_equipment(model, serial, id)

前两列可以按任意顺序。

+0

所以你说现有的查询是好的,有没有更好的方式来实现这一目标? –

+1

好吧,我添加了索引,并且我被性能改进所打动!最初耗时5-8秒的查询现在需要0.5秒!谢谢! –

+0

为了澄清,这是编写这种查询类型的最佳方法吗?我看到一些使用LEFT JOIN和GROUP BY语句的人,但是这增加了一些复杂性和问题,因为我需要返回多个连接表中的许多/所有字段。 –