2017-07-28 62 views
-1

我試圖使用在多個表上留下連接的查詢來獲取數據。查詢返回4132行,需要4.55秒的持續時間,在mysql workbench中獲取31.30秒。我甚至試圖從php執行它,但需要相同的時間。mysql - 具有多個左連接的查詢需要的時間太長

SELECT 
       aa.bams_id AS chassis_bams_id, aa.hostname AS chassis_hostname, 
    aa.rack_number AS chassis_rack, aa.serial_number AS chassis_serial, aa.site_id AS chassis_site_id, 
    cb.bay_number, cb.bsn AS serial_number_in_bay, 
CASE 
       WHEN a_a.bams_id IS NULL THEN 'Unknown' 
       ELSE a_a.bams_id 
END AS blade_bams_id, 
       a_a.hostname AS blade_hostname, a_s.description AS blade_status, a_a.manufacturer AS blade_manufacturer, a_a.model AS blade_model, 
       a_a.bookable_unit_id AS blade_bookable_unit_id, a_a.rack_number AS blade_rack_number, a_a.manufactured_date AS blade_manufactured_date, 
       a_a.support_expired_date AS blade_support_expired_date, a_a.site_id AS blade_site_id 
FROM all_assets aa 
       LEFT JOIN manufacturer_model mm ON aa.manufacturer = mm.manufacturer AND aa.model = mm.model 
       LEFT JOIN chassis_bays cb ON aa.bams_id = cb.chassis_bams_id 
       LEFT JOIN all_assets a_a ON cb.bsn = a_a.serial_number 
       LEFT JOIN asset_status a_s ON a_a.status=a_s.status 
WHERE mm.hardware_type = 'chassis'; 

這些是被使用表的定義:

enter image description here

EXPLAIN輸出:

enter image description here

查詢在每個機箱取出每個葉片的數據。 在其他系統上執行相同的查詢,只需5秒即可獲取結果。

如何優化此查詢?

更新(解決)

新增指標由專家在這裏建議。 下面是添加索引後的執行計劃。

enter image description here

+1

運行'EXPLAIN';將索引添加到連接列。 –

+0

@TimBiegeleisen增加了'EXPLAIN'的結果。 – Valay

+1

這不是「表格的定義」,它是表格中列出屬性的東西的屏幕截圖。這裏有很多關於緩慢的mysql查詢的帖子 - 請閱讀其中的一些內容,注意哪些是downvoted和關閉的,哪些是upvoted和回答,如果你仍然無法解決問題你自己將你學到的東西應用於你的問題。 – symcbean

回答

1

創建索引,索引不讀是慢於指數讀取。

,以確定到底是什麼原因造成你降低性能的最佳工具 是使用「查詢計劃分析器」:

看一看這裏: mySql performance explain

嘗試在最明顯的創建索引閱讀將會發生。查看加入時起作用的字段以及where子句。如果您在這些字段上有索引,如果發生非索引讀取,您的性能應該會增加。

如果這仍然是一個問題,最好看看mySQL如何獲取數據, 有時重構您的數據,或者甚至可能改變你排隊的方式 可以給你更好的結果。

例如。創建索引:aa.manufacturer_model,aa.manufacturer,aa.model和mm.hardware_type

+0

增加了索引,現在它工作正常。需要0.062秒來獲取數據。添加索引後,我也更新了我的問題描述和執行計劃。 – Valay