性能分析:hash索引导致delete慢
前端时间,应用人员上报一个性能问题:在生产环境中,每天凌晨时段数据库运行很慢,一些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索引造成。
优化方案:
把delete改为没有where条件的全表delete或truncate(该表数据是缓存数据)。
把HASH索引改为BTREE索引。
注:由于btree索引占用的内存空间很大(经测试,btree索引占用空间是hash索引的6倍以上),数据库主机当时内存紧张,所以优先使用方案1。
转载于:https://blog.51cto.com/elison/1771144
性能分析:hash索引导致delete慢相关推荐
- postgreSQL源码分析——索引的建立与使用——Hash索引(2)
2021SC@SDUSC 目录 Hash索引创建 hashbuild函数 _hash_init函数 Hash索引的插入 hashinsert函数 _hash_doinsert函数 总结 Hash索引创 ...
- 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 ...
- mysql索引结构原理、性能分析与优化
摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与Inno ...
- MySQL02--高级(BTreeB+Tree、聚簇索引非聚簇索引、性能分析(Explain)、索引、sql优化)
1.MySQL架构 2.sql 执行顺序: FROM <LEFT_TABLE> ON <JOIN_CONDITION> <JOIN_TYPR> JOIN <R ...
- 索引-性能分析-查看SQL执行频次以及慢查询日志
索引语法 1.创建索引时候 [UNIQUE | FULLTEXT] 关键字是可选的: 1)加上 UNIUQE 就是创建唯一索引(唯一索引,说明改字段不能出现重复数据): 2)加上FULLTEXT 创建 ...
- MySQL第11天:MySQL索引优化分析之性能分析
MySQL索引优化分析之性能分析 一.MySQL Query Optimizer 二.MySQL常见瓶颈 三.Explain(执行计划) 1.什么是执行计划? 2.执行计划能干什么? ...
- 小编带你了解oracle使用索引和不使用索引性能分析
首先准备一张百万条数据的表,这样分析数据差距更形象! 下面用分页表数据对表进行分析,根据EMP_ID 字段排序,使用索引和不使用索引性能差距! sql查询语法准备,具体业务根据具体表书写sql语法: ...
- MySQL 性能分析 之 联合索引(复合索引)实践分析
MySQL 性能分析 之 联合索引(复合索引)实践分析 作为开发者,大家都知道,一个服务器.一个数据库的性能是项目的重中之重,后台架构.写法与数据库设计的好坏往往直接影响到整个项目的性能. 索引:是当 ...
- postgreSQL源码分析——索引的建立与使用——Hash索引(3)
2021SC@SDUSC 上一篇博客讲了关于Hash索引创建与插入的相关函数,这一篇博客讲述关于溢出页的操作函数以及Hash表的扩展相关的函数. 目录 溢出页的分配和回收 _hash_addovflp ...
最新文章
- 【Groovy】Groovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )
- 给嵌入式工程师的一封信
- 基于ZF网络的Faster RCNN网络结构详解(非常详细版)
- python基础期末考试_python基础试题(4)
- 怎样设计一个良好大数据处理的解决方案?
- 前端学习(508):水平和垂直居中第一种方式
- maven 打包指定依赖包_Maven打包成Jar文件时依赖包的问题
- embedv.php_PHP与视频播放插件功能实现,非常简单
- Oracle Clusterware工具3
- U盘文件被隐藏是怎么回事?怎样恢复被隐藏文件?
- python数据清洗
- 移动硬盘无法访问需要格式化,怎样恢复移动硬盘数据
- 中国SaaS产品成功四要素和四层次
- java 中文分割_在java中只分割中文字符
- macbook pro2020无法识别西部数据2T硬盘
- 试用期、见习期、实习期、合同期、服务期的区别与应用
- 干货|23种最好用的3D打印软件工具
- 医院影像服务器系统,锐潮医学影像管理系统(PACS)
- html css 奥运五环,用css写一个有趣的奥运五环~。
- 2021最新大厂Java面试集合,顺利拿到offer
热门文章
- LNMP安装常见问题集锦(一)
- Mysql学习笔记【原创】
- 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:小技能 DeleteMark)...
- vue单页面跳页没有数据了_详解刷新页面vuex数据不消失和不跳转页面的解决
- iar升级芯片库_顶10个GPU!阿里巴巴重磅发布含光800芯片
- SQLite中的SELECT子句使用别名
- 数据包发包工具bittwist
- iOS 9应用开发教程之使用代码添加按钮美化按钮
- 计算机操作员中级操作试题,中级计算机操作员应知模拟考试试题(一)
- ueditor集成实例php,Laravel框架集成UEditor编辑器的方法图文与实例详解