【发布时间】:2017-07-28 18:28:57
【问题描述】:
我正在尝试使用在多个表上留下联接的查询来获取数据。该查询返回 4132 行,持续时间为 4.55 秒,mysql workbench 中的获取时间为 31.30 秒。我什至尝试从php 执行它,但这需要相同的时间。
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';
这些是正在使用的表的定义:
EXPLAIN 的输出:
查询获取每个机箱中每个刀片的数据。 在其他系统上执行相同的查询,只需要 5 秒即可获取结果。
如何优化此查询?
更新(已解决)
在这里添加了专家建议的索引。 下面是添加索引后的执行计划。
【问题讨论】:
-
运行
EXPLAIN;向连接列添加索引。 -
@TimBiegeleisen 添加了
EXPLAIN的结果。 -
这不是“表格的定义”,它是一个列出表格中属性的东西的屏幕截图。这里有很多关于缓慢 mysql 查询的帖子 - 请阅读其中的一些帖子,注意那些被否决和关闭的帖子中缺少什么,那些被投票和回答的帖子中存在什么,如果你仍然无法解决问题自己将学到的知识应用到问题中。
-
你没有索引,所以去添加它们。
-
如果可能,请使用
INNER JOIN,如果它不会对您的业务逻辑产生任何影响。如果它会产生任何影响,那么请选择与INDICES.
标签: mysql sql mysql-workbench