2017-07-28 164 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