我的编程空间,编程开发者的网络收藏夹
学习永远不晚

性能分析:hash索引导致delete慢

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

性能分析:hash索引导致delete慢

前端时间,应用人员上报一个性能问题:在生产环境中,每天凌晨时段数据库运行很慢,一些EVENT运行失败,导致一部分应用功能异常。


根据应用人员提供的时间段,对数据库进行排查。


先对主机CPU、IO、数据库连接等监控历史数据进行分析,确认故障时间线,缩小时间范围。

性能分析:hash索引导致delete慢


从上图看到0:30左右,数据库活动连接由0增到200,1:09活动连接数增到400+,数据库连接异常增高,需要进一步分析数据库此时间在执行什么操作。


性能分析:hash索引导致delete慢

对抓取到的历史数据(主机部署了shell监控脚本)进行分析:在0:30,数据库正在对表_1030做delete操作,其他线程在等待表锁。

综合以上,梳理出故障时间线:

监控数据显示,0:30表_1030进行delete操作,该操作在1:15分左右才执行完成,该操作运行了40+分钟左右,此期间表_1030的select操作被阻塞,导致数据库连接从0升高到200,最大达到400,应用异常:


造成阻塞的SQL为:

DELETE FROM _1030 WHERE _1030.F05 <=  NAME_CONST('_current_date',_latin1'2016-01-17 00:30:00' COLLATE 'latin1_swedish_ci')


结合以上,有2个疑问:

该delete语句为什么会产生表锁?

该delete语句为什么这么慢?能否优化?


(root@172.30.3.113) [(none)]> show create table S11._1030 \G

*************************** 1. row ***************************

       Table: _1030

Create Table: CREATE TABLE `_1030` (

  `F01` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `F02` char(45) NOT NULL,

  `F03` datetime NOT NULL,

  `F04` int(10) unsigned DEFAULT NULL,

  `F05` datetime NOT NULL,

  `F06` varchar(40) NOT NULL,

  `F07` varchar(40) DEFAULT NULL,

  PRIMARY KEY (`F01`),

  UNIQUE KEY `F02` (`F02`) USING HASH,

  KEY `F06` (`F06`) USING HASH,

  KEY `F07` (`F07`) USING HASH

) ENGINE=MEMORY DEFAULT CHARSET=utf8

1 row in set (0.00 sec)


通过查看发现该表是heap表,heap表数据都在内存里,heap性能应该是很快的,该delete语句为什么这么慢?


在测试环境进行测试,DELETE _1030 50w的数据量需要58s,慢的不合常理。删除该表的索引后,delete 1s内完成。这里基本确认索引维护代价太大导致。

添加btree索引,再次测试,delete 1s内完成。确认是hash索引造成。


优化方案:

  1. 把delete改为没有where条件的全表delete或truncate(该表数据是缓存数据)。

  2. 把HASH索引改为BTREE索引。


注:由于btree索引占用的内存空间很大(经测试,btree索引占用空间是hash索引的6倍以上),数据库主机当时内存紧张,所以优先使用方案1。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

性能分析:hash索引导致delete慢

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql覆盖索引高性能的示例分析

这篇文章主要介绍mysql覆盖索引高性能的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、高性能的原因索引通常比记录要小,覆盖索引查询只需要读索引,而不需要读记录。索引都按照值的大小进行顺序存储,相比与随机
2023-06-15

mysql/oracle 数据库delete操作太慢(where ... in ...),不加索引,一招让性能提升百倍

背景 delete操作应用虽然不多,但是有些场景使用起来还是更方便。比如 在数仓项目中,软删虽然更快更安全,但是缺点也很多: 1、软删造成数据冗余,甚至快速膨胀的后果。比如一些中间表,只是作为中转站,过两天数据就分配其他表了,不硬删的话就会
2023-08-17

柏睿数据RapidsDB探索极致数据分析性能的技术原理与实践

数据分析引擎是数字经济时代的新动能,但很多数据分析引擎无法满足实时处理大规模数据的性能要求。柏睿数据从“根技术”自主研发的全内存分布式数据库RapidsDB,通过内存存储、MPP并行计算、动态查询优化和即时编译等查询性能优化技术,为企业提供
柏睿数据2024-11-30

低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限的示例分析

这篇文章将为大家详细讲解有关低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。现象应用升级MySQL驱动8.0后,在并发量较高时,查
2023-06-20

编程热搜

目录