2017-11-25 108 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語句的人,但是這增加了一些複雜性和問題,因爲我需要返回多個連接表中的許多/所有字段。 –