加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.dadazhan.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL选错索引导致的线上慢查询事故怎么做

发布时间:2022-02-24 13:15:26 所属栏目:MySql教程 来源:互联网
导读:小编给大家分享一下MySQL选错索引导致的线上慢查询事故怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 在 线上某数据库突然收到大量告警,慢查询数超标,并且引发了
       小编给大家分享一下MySQL选错索引导致的线上慢查询事故怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
  
     在 线上某数据库突然收到大量告警,慢查询数超标,并且引发了连接数暴增,导致数据库响应缓慢,影响业务。看图表慢查询在高峰达到了每分钟14w次,在平时正常情况下慢查询数仅在两位数以下

     赶紧查看慢SQL记录,发现都是同一类语句导致的慢查询(隐私数据例如表名,我已经隐去):
 
select
  *
from
  sample_table
where
    1 = 1
    and (city_id = 565)
    and (type = 13)
order by
  id desc
limit
  0, 1复制代码
     看起来语句很简单,没什么特别的。但是每个执行的查询时间达到了惊人的44s。
  
     简直耸人听闻,这已经不是“慢”能形容的了...
 
     接下来查看表数据信息,

     可以看到表数据量较大,预估行数在83683240,也就是8000w左右,千万数据量的表。
 
     大致情况就是这样,下面进入排查问题的环节。
 
问题原因排查
首先当然要怀疑会不会该语句没走索引,查看建表DML中的索引:
 
KEY `idx_1` (`city_id`,`type`,`rank`),
KEY `idx_log_dt_city_id_rank` (`log_dt`,`city_id`,`rank`),
KEY `idx_city_id_type` (`city_id`,`type`)复制代码
请忽略idx_1和idx_city_id_type两个索引的重复,这都是历史遗留问题了。
 
可以看到是有idx_city_id_type和idx_1索引的,我们的查询条件是city_id和type,这两个索引都是能走到的。
 
但是,我们的查询条件真的只要考虑city_id和type吗?(机智的小伙伴应该注意到问题所在了,先往下讲,留给大家思考)
 
既然有索引,接下来就该看该语句实际有没有走到索引了,MySQL提供了Explain可以分析SQL语句。Explain 用来分析 SELECT 查询语句。
  
我们使用Explain分析该语句:
 
select * from sample_table where city_id = 565 and type = 13 order by id desc limit 0,1复制代码
得到结果:
 
可以看出,虽然possiblekey有我们的索引,但是最后走了主键索引。而表是千万级别,并且该查询条件最后实际是返回的空数据,也就是MySQL在主键索引上实际检索时间很长,导致了慢查询。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读