用于查看性能缓慢的 MySQL 查询

Posted

技术标签:

【中文标题】用于查看性能缓慢的 MySQL 查询【英文标题】:MySQL query for view slow performance 【发布时间】:2017-10-24 09:42:55 【问题描述】:

我在视图中使用了以下查询:

select `a`.`device_id` AS `device_id`,
       `a`.`alias` AS `alias`,
       `a`.`freq` AS `freq`,
       `a`.`gateway` AS `gateway`,
       `a`.`device_lat` AS`device_lat`,
       `a`.`device_long` AS `device_long`,
       `a`.`device_disabled` AS `device_disabled`,
       count(`b`.`msg_id`) AS `total_messages`,
       avg(`b`.`rssi`) AS `avg_rssi`,
       max(`b`.`db_timestamp`) AS `last_active`,
       (now() <= (max(`b`.`db_timestamp`) + interval 3 hour)) AS `device_status`
from `demo`.`lora_device` `a` 
left join `demo`.`lora_message` `b` on `a`.`device_id` = `b`.`eui` 
group by `a`.`device_id`

加载此查询大约需要 4 秒,有关标签的信息:

lora_message : 25k 行约 20 列

lora_device : 520 行约 10 列

通常我会说这对 mysql 来说不是问题,但由于某种原因它运行得很慢。

【问题讨论】:

【参考方案1】:

尝试添加索引

 create index ix_loramessage_rssi on lora_message(eui, rssi)
 create index ix_loramessage_db_timestamp on lora_message(eui, db_timestamp)

并使用

 count(`b`.`rssi`) AS `total_messages`,

而不是

 count(`b`.`msg_id`) AS `total_messages`,

因为它应该在您的查询中返回相同的结果

【讨论】:

谢谢!我已经添加了索引,现在查询在 0.05 秒内运行。

以上是关于用于查看性能缓慢的 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

优化缓慢的 MySQL 选择查询

分析 Mnesia 查询

MYSQL 查看查询性能问题

链接服务器查询性能缓慢

性能测试-MySQL性能查看(转)

怎么查看mysql日志