【问题标题】:mysql - query with multiple left joins takes too longmysql - 具有多个左连接的查询需要太长时间
【发布时间】: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


【解决方案1】:

创建索引,非索引读取比索引读取慢。

要准确确定导致性能下降的原因,最好的工具 是使用“查询计划分析器”:

看看这里: mySql performance explain

尝试在将要发生的最明显的读取上创建索引。查看在您加入时发挥作用的字段以及您的 where 子句。如果您在这些字段上有索引,如果发生非索引读取,您的性能应该会提高。

如果这仍然是一个问题,最好看看 mySQL 是如何获取数据的, 有时会重组您的数据,甚至可能会改变您排队的方式 可以给你更好的结果。

例如。为 aa.manufacturer_model、aa.manufacturer、aa.model 和 mm.hardware_type 创建索引

【讨论】:

  • 添加了索引,现在可以正常工作了。获取数据需要 0.062 秒。添加索引后,我还使用执行计划更新了我的问题描述。
猜你喜欢
  • 2012-03-17
  • 2021-10-11
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多