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

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

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

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

对抓取到的历史数据(主机部署了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。

转载于:https://blog.51cto.com/elison/1771144

性能分析:hash索引导致delete慢相关推荐

  1. postgreSQL源码分析——索引的建立与使用——Hash索引(2)

    2021SC@SDUSC 目录 Hash索引创建 hashbuild函数 _hash_init函数 Hash索引的插入 hashinsert函数 _hash_doinsert函数 总结 Hash索引创 ...

  2. MySQL 进阶 索引 -- SQL性能分析(SQL执行频率:查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次、慢查询日志、 profile详情、explain)

    文章目录 1. SQL性能分析 1.1 SQL执行频率(可以查看当前数据库SQL的访问频次) 1.2 慢查询日志(可以记录用时较长的SQL) 1.2.1 开启慢查询日志 1.2.2 慢查询日志测试 1 ...

  3. mysql索引结构原理、性能分析与优化

    摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与Inno ...

  4. MySQL02--高级(BTreeB+Tree、聚簇索引非聚簇索引、性能分析(Explain)、索引、sql优化)

    1.MySQL架构 2.sql 执行顺序: FROM <LEFT_TABLE> ON <JOIN_CONDITION> <JOIN_TYPR> JOIN <R ...

  5. 索引-性能分析-查看SQL执行频次以及慢查询日志

    索引语法 1.创建索引时候 [UNIQUE | FULLTEXT] 关键字是可选的: 1)加上 UNIUQE 就是创建唯一索引(唯一索引,说明改字段不能出现重复数据): 2)加上FULLTEXT 创建 ...

  6. MySQL第11天:MySQL索引优化分析之性能分析

    MySQL索引优化分析之性能分析 一.MySQL Query Optimizer 二.MySQL常见瓶颈 三.Explain(执行计划) 1.什么是执行计划?          2.执行计划能干什么? ...

  7. 小编带你了解oracle使用索引和不使用索引性能分析

    首先准备一张百万条数据的表,这样分析数据差距更形象! 下面用分页表数据对表进行分析,根据EMP_ID 字段排序,使用索引和不使用索引性能差距! sql查询语法准备,具体业务根据具体表书写sql语法: ...

  8. MySQL 性能分析 之 联合索引(复合索引)实践分析

    MySQL 性能分析 之 联合索引(复合索引)实践分析 作为开发者,大家都知道,一个服务器.一个数据库的性能是项目的重中之重,后台架构.写法与数据库设计的好坏往往直接影响到整个项目的性能. 索引:是当 ...

  9. postgreSQL源码分析——索引的建立与使用——Hash索引(3)

    2021SC@SDUSC 上一篇博客讲了关于Hash索引创建与插入的相关函数,这一篇博客讲述关于溢出页的操作函数以及Hash表的扩展相关的函数. 目录 溢出页的分配和回收 _hash_addovflp ...

最新文章

  1. 【Groovy】Groovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )
  2. 给嵌入式工程师的一封信
  3. 基于ZF网络的Faster RCNN网络结构详解(非常详细版)
  4. python基础期末考试_python基础试题(4)
  5. 怎样设计一个良好大数据处理的解决方案?
  6. 前端学习(508):水平和垂直居中第一种方式
  7. maven 打包指定依赖包_Maven打包成Jar文件时依赖包的问题
  8. embedv.php_PHP与视频播放插件功能实现,非常简单
  9. Oracle Clusterware工具3
  10. U盘文件被隐藏是怎么回事?怎样恢复被隐藏文件?
  11. python数据清洗
  12. 移动硬盘无法访问需要格式化,怎样恢复移动硬盘数据
  13. 中国SaaS产品成功四要素和四层次
  14. java 中文分割_在java中只分割中文字符
  15. macbook pro2020无法识别西部数据2T硬盘
  16. 试用期、见习期、实习期、合同期、服务期的区别与应用
  17. 干货|23种最好用的3D打印软件工具
  18. 医院影像服务器系统,锐潮医学影像管理系统(PACS)
  19. html css 奥运五环,用css写一个有趣的奥运五环~。
  20. 2021最新大厂Java面试集合,顺利拿到offer

热门文章

  1. LNMP安装常见问题集锦(一)
  2. Mysql学习笔记【原创】
  3. 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:小技能 DeleteMark)...
  4. vue单页面跳页没有数据了_详解刷新页面vuex数据不消失和不跳转页面的解决
  5. iar升级芯片库_顶10个GPU!阿里巴巴重磅发布含光800芯片
  6. SQLite中的SELECT子句使用别名
  7. 数据包发包工具bittwist
  8. iOS 9应用开发教程之使用代码添加按钮美化按钮
  9. 计算机操作员中级操作试题,中级计算机操作员应知模拟考试试题(一)
  10. ueditor集成实例php,Laravel框架集成UEditor编辑器的方法图文与实例详解