mysql - 具有多个左连接的查询花费太长时间

标签 mysql sql mysql-workbench

我正在尝试使用在多个表上留下连接的查询来获取数据。该查询返回 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';

这些是正在使用的表的定义:

enter image description here

EXPLAIN 的输出:

enter image description here

该查询获取每个机箱中每个 Blade 的数据。 在其他系统上执行相同的查询,只需要 5 秒即可获取结果。

如何优化此查询?

更新(已解决)

按照专家的建议添加了此处的索引。 下面是添加索引后的执行计划。

enter image description here

最佳答案

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

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

看这里: mySql performance explain

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

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

例如。为以下对象创建索引:aa.manufacturer_model、aa.manufacturer、aa.model 和 mm.hardware_type

关于mysql - 具有多个左连接的查询花费太长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45369701/

相关文章:

php - 如何在没有任何循环php的情况下从数组中随机获取项目

mysql - AWS Data Pipeline MySQL Nulls sed shell 命令事件 MIGRAINE

c# - 同时使用 Entity Framework 和 SqlConnection?

python - 根据另一列值划分同一列中的行

mysql - mysql中where条件多的sql是否比mysql中条件少的sql快?

mysql - 使用不同的表列进行sphinx搜索权重排序

php - 如何将多行文本的每一行单独存储到mysql中

MySQL Workbench 在 EER 建模中加入架构

mysql - 如何才能最大程度地减少在不经意间更改数据而甚至没有注意到的情况?

mysql - SQL : Show date when product was present in 6 months of data