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在主键索引上实际检索时间很长,导致了慢查询。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |