MySQL:提高子选择查询的效率

标签 mysql sql performance subquery

我有一组(MySQL)表,如下所示。我需要根据匹配的型号/序列号检索故障单列表,以及任一设备表中匹配设备的 ID。

请注意,型号/序列号组合在两个设备表中应该是唯一的,但型号/序列号输入框是自由格式的,因此用户有可能输入相同的型号/连续两次。在这种情况下,检索哪个设备单元并不重要,但每张票证只应返回结果,因为我们显示的是票证列表,而不是设备。

“故障单”[故障单表]

  • id [索引]
  • 型号[设备型号]
  • serial [设备序列号]
  • ...等

user_equipment [用户设备表]

  • id [索引]
  • 型号[设备型号]
  • serial [设备序列号]
  • ...等

site_equipment [现场设备]

  • id [索引]
  • 型号[设备型号]
  • serial [设备序列号]
  • ...等

目前我使用子查询返回用户和站点设备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(型号、序列号、id)
  • site_equipment(型号、序列号、id)

前两列可以按任意顺序排列。

关于MySQL:提高子选择查询的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47491025/

相关文章:

php - 无法解释的 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens'

mysql - COUNT 次获胜次数和 MAX 次使用 MySQL 获胜次数最多的参与者

mysql - 如何使用 mySQL View 和 UPDATE 更改表

java - Hibernate和mysql错误: Cannot add or update a child row

sql - 与内部联接相比,使用 WHERE 子句的交叉联接的性能

c# - 数据何时加载到应用服务器的内存中?

php - 使用redis的新闻提要

java - 实际上没有插入到 MySQL 中,但是自动增量字段在增加?

mysql - SQL - 每个日期具有相同日期的总和值

jquery - jQuery 1.4 中的事件委托(delegate)