PostgreSQL and MySQL lock compare ext.
事情的起因是这样的,今天同事碰到MYSQL奇怪的慢查询问题,大概如下:
select * from table where id=?
id是主键,按常理,这条SQL应该很快才对,但是每天都有不定期的出现慢的情况。
这个表只有三种操作,insert delete ,select。
经过下面的实验发现了一个很严重的问题,MYSQL的锁似乎有点暴力,在对表进行DML操作的时候,SELECT需要等待。
测试如下(分别对MyISAM和innodb引擎的表进行了测试):
create table tbl_test1 (id int primary key) engine=myisam;
insert into tbl_test1 (3千万记录)
create table tbl_test2 (id int primary key) engine=innodb;
insert into tbl_test2 (3千万记录)
看看执行计划:
select * from tbl_test1 wher id=?+—-+————-+———–+——-+—————+—————+———+——-+——+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+———–+——-+—————+—————+———+——-+——+————-+
| 1 | SIMPLE | tbl_test1 | const | tbl_test2_idx | tbl_test2_idx | 4 | const | 1 | Using index |
+—-+————-+———–+——-+—————+—————+———+——-+——+————-+
1 row in set (0.00 sec)
+—-+————-+———–+——-+—————+—————+———+——-+——+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+———–+——-+—————+—————+———+——-+——+————-+
| 1 | SIMPLE | tbl_test2 | const | tbl_test2_idx | tbl_test2_idx | 4 | const | 1 | Using index |
+—-+————-+———–+——-+—————+—————+———+——-+——+————-+
1 row in set (0.00 sec)
+—-+————-+———–+——-+—————+—————+———+——-+——+————-+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+—-+————-+———–+——-+—————+—————+———+——-+——+————-+| 1 | SIMPLE | tbl_test2 | const | tbl_test2_idx | tbl_test2_idx | 4 | const | 1 | Using index |+—-+————-+———–+——-+—————+—————+———+——-+——+————-+1 row in set (0.00 sec)
好了,接下来开始执行一条删除的SQL
session1:delete from tbl_test1 where id <?session 2:select * from tbl_test1 where id=?session 3:show processlist;mysql> show processlist;+—-+——+———–+——+———+——+———-+—————————————–+| Id | User | Host | db | Command | Time | State | Info |+—-+——+———–+——+———+——+———-+—————————————–+| 3 | root | localhost | test | Query | 23 | Locked | select * from tbl_test2 where id=122767 || 4 | root | localhost | test | Query | 24 | updating | delete from tbl_test2 where id<6276758 || 5 | root | localhost | test | Query | 0 | NULL | show processlist |+—-+——+———–+——+———+——+———-+—————————————–+3 rows in set (0.00 sec)mysql> show processlist;+—-+——+———–+——+———+——+———-+—————————————–+| Id | User | Host | db | Command | Time | State | Info |+—-+——+———–+——+———+——+———-+—————————————–+| 3 | root | localhost | test | Query | 23 | Locked | select * from tbl_test1 where id=10122767 || 4 | root | localhost | test | Query | 24 | updating | delete from tbl_test1 where id<6276758 || 5 | root | localhost | test | Query | 0 | NULL | show processlist |+—-+——+———–+——+———+——+———-+—————————————–+3 rows in set (0.00 sec)
在SESSION1删除TBL_TEST2的某些记录时,SESSION2查询处于等待状态。
所以,DELETE如果慢的话,SELECT也跟着变慢了。这太不能接受了,而且myisam和innode都一样。
最不能理解的是删除的记录里面并没有包含我要查询的记录,为啥要等待呢?
接下来看看PostgreSQL:
同样的表,SESSION1在删除时,SESSION2的查询不会受到影响,SESSION2在SESSION1没有真正删除到被删除的行是,SESSION2是可以查询到该记录的。很明显在Postgresql做批量删除时,是行锁或块锁。所以并发度很好。
而MYSQL在删除时看样子不应该是行锁或块锁,所以并发性能不好。
在设计MYSQL的应用的时候,切记这种类型的SQL操作,防止并发下降.
(我对MYSQL还不太熟悉,哈哈,写的不对的话请多批评)
PostgreSQL and MySQL lock compare ext.相关推荐
- PostgreSQL和MySQL技术全面剖析
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 本文介绍MySQ ...
- 使用Testcontainers和PostgreSQL,MySQL或MariaDB的Spring Boot测试
Testcontainers是一个Java库,可轻松将Docker容器集成到JUnit测试中. 在Containerized World中 ,将测试配置与嵌入式数据库和服务复杂化几乎没有意义. 而是使 ...
- 用于打开和创建SQLite,Microsoft SQL Server,PostgreSQL和MySQL SQL数据库的WPF对话框
目录 介绍 创建数据库对话框 打开数据库对话框 背景 使用代码 显示数据库对话框 加密 序列化 构建演示应用程序 遗漏 从Github下载源代码 介绍 本文介绍了一些用于创建和打开SQL数据库的便捷对 ...
- PostgreSQL 优势,MySQL 数据库自身的特性并不十分丰富,触发器和存储过程的支持较弱,Greenplum、AWS 的 Redshift 等都是基于 PostgreSQL 开发的...
PostgreSQL 优势 2016-10-20 21:36 686人阅读 评论(0) 收藏 举报 分类: MYSQL数据库(5) PostgreSQL 是一个自由的对象-关系数据库服务器(数据库 ...
- PostgreSQL vs MySQL——哪种关系数据库更好?
PostgreSQL和MySQL是世界上最流行的两种关系数据库管理系统(RDMS).包括商业企业和开源基金会在内的所有市场人口都在使用它们.它们的共同点是强大的网络容错能力和对数据聚类的支持.这篇文章 ...
- 比较PostgreSQL与MySQL两大开源关系数据库管理系统
MySQL 和 PostgreSQL 是两大开源关系数据库管理系统 (RDBMS),长期以来被证明具有高度的可靠性和可扩展性,在本文中,我们将探讨 PostgreSQL 与 MySQL,以及它们之间的 ...
- PostgreSQL 和 MySQL 之间的性能差异
导读:在本文中,我们将讨论工作负载分析和运行查询,一起了解两个数据库系统在 JSON.索引和并发方面的性能差异. 简介 在管理数据库时,性能是一项非常重要而又复杂的任务.它可能会受到系统的配置.硬件甚 ...
- postgresql和mysql的一转多多转一
postgresql和mysql的一转多多转一 日常工作中常有出现如下图的情形,需要将一个数据转成多行或者多列,或者由多行或者多列转成一个数据,本文分别用postgresql和mysql处理这个问题. ...
- mysql lock wait_Mysql错误: Lock wait timeout exceeded 解决办法
一.临时解决办法: 执行mysql命令:show full processlist; 然后找出插入语句的系统id 执行mysql命令:kill id 或 首先,查看数据库的进程信息: show ful ...
- mysql到pg怎么高效_利用Navicat高效率postgresql转mysql数据库
本人很喜欢postgresql数据库,也一直认为postgresql比mysql要更好更强大. 可生态环境太差了,无奈,最近要把一个小站转成mysql数据库. 小站主要表数据110万,pg_dump备 ...
最新文章
- python sql解析引擎_python SQLAlchemy 中的Engine详解
- 【转】early-z、z-culling、hi-z、z-perpass
- Mono.Android 基础
- MapReduce-Combiner规约-原理分析
- SAP Spartacus Organization Unit List三个按钮的技术实现
- 帧大小超过交换机mtu_tcpip – UDP中的MTU如何为65535,但以太网不允许超过1500字节的帧大小...
- 伏安特性曲线实验报告_电化学扩散层,Cottrell equation,取样电流伏安法
- 【知识分享】异步调用与多线程的区别
- hibernate 调用oracle存储过程,hibernate调用oracle存储过程||函数
- 权威解读 GitHub、Apache 疑云:主流开源软件究竟是否会被闭源?| CSDN 独家
- 深度linux双显卡死机,Deepin配置IntelNvidia双显卡
- DPlayer.js视频播放插件
- html代码seo,SEO必学基础html代码基础
- 免费领7天腾讯视频VIP/优酷会员!
- 15ubuntu20.04离线安装openssh8.9.p1
- 这可能是你看到最详细的NCF代码讲解(1)数据处理篇
- 基于单片机的车内滞留儿童预警系统设计
- 根据excel模板导出
- python3爬取笔趣阁小说
- 经验分享|在龙芯2K上运行RT-Thread系统并开源
热门文章
- maven环境、本地仓储配置(下载安装)idea配置maven
- Kubernetes kubeadm 安装记录
- nodejs之querystring模块
- 欢迎访问我的博客园,希望对你有所帮助
- 2018.11.09 bzoj4773: 负环(倍增+floyd)
- 常用sql server 语句
- 2016年第5本:必然
- 【转】LoadRunner使用Libmemcached与Memcached通讯
- Verilog 常规数据定义
- 用 TStringList 模拟 将字符串转换为变量的功能 - 回复 flq_00000 和 外来天客 的问题...