事情的起因是这样的,今天同事碰到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.相关推荐

  1. PostgreSQL和MySQL技术全面剖析

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 本文介绍MySQ ...

  2. 使用Testcontainers和PostgreSQL,MySQL或MariaDB的Spring Boot测试

    Testcontainers是一个Java库,可轻松将Docker容器集成到JUnit测试中. 在Containerized World中 ,将测试配置与嵌入式数据库和服务复杂化几乎没有意义. 而是使 ...

  3. 用于打开和创建SQLite,Microsoft SQL Server,PostgreSQL和MySQL SQL数据库的WPF对话框

    目录 介绍 创建数据库对话框 打开数据库对话框 背景 使用代码 显示数据库对话框 加密 序列化 构建演示应用程序 遗漏 从Github下载源代码 介绍 本文介绍了一些用于创建和打开SQL数据库的便捷对 ...

  4. PostgreSQL 优势,MySQL 数据库自身的特性并不十分丰富,触发器和存储过程的支持较弱,Greenplum、AWS 的 Redshift 等都是基于 PostgreSQL 开发的...

    PostgreSQL 优势 2016-10-20 21:36 686人阅读 评论(0) 收藏 举报  分类: MYSQL数据库(5)  PostgreSQL 是一个自由的对象-关系数据库服务器(数据库 ...

  5. PostgreSQL vs MySQL——哪种关系数据库更好?

    PostgreSQL和MySQL是世界上最流行的两种关系数据库管理系统(RDMS).包括商业企业和开源基金会在内的所有市场人口都在使用它们.它们的共同点是强大的网络容错能力和对数据聚类的支持.这篇文章 ...

  6. 比较PostgreSQL与MySQL两大开源关系数据库管理系统

    MySQL 和 PostgreSQL 是两大开源关系数据库管理系统 (RDBMS),长期以来被证明具有高度的可靠性和可扩展性,在本文中,我们将探讨 PostgreSQL 与 MySQL,以及它们之间的 ...

  7. PostgreSQL 和 MySQL 之间的性能差异

    导读:在本文中,我们将讨论工作负载分析和运行查询,一起了解两个数据库系统在 JSON.索引和并发方面的性能差异. 简介 在管理数据库时,性能是一项非常重要而又复杂的任务.它可能会受到系统的配置.硬件甚 ...

  8. postgresql和mysql的一转多多转一

    postgresql和mysql的一转多多转一 日常工作中常有出现如下图的情形,需要将一个数据转成多行或者多列,或者由多行或者多列转成一个数据,本文分别用postgresql和mysql处理这个问题. ...

  9. mysql lock wait_Mysql错误: Lock wait timeout exceeded 解决办法

    一.临时解决办法: 执行mysql命令:show full processlist; 然后找出插入语句的系统id 执行mysql命令:kill id 或 首先,查看数据库的进程信息: show ful ...

  10. mysql到pg怎么高效_利用Navicat高效率postgresql转mysql数据库

    本人很喜欢postgresql数据库,也一直认为postgresql比mysql要更好更强大. 可生态环境太差了,无奈,最近要把一个小站转成mysql数据库. 小站主要表数据110万,pg_dump备 ...

最新文章

  1. python sql解析引擎_python SQLAlchemy 中的Engine详解
  2. 【转】early-z、z-culling、hi-z、z-perpass
  3. Mono.Android 基础
  4. MapReduce-Combiner规约-原理分析
  5. SAP Spartacus Organization Unit List三个按钮的技术实现
  6. 帧大小超过交换机mtu_tcpip – UDP中的MTU如何为65535,但以太网不允许超过1500字节的帧大小...
  7. 伏安特性曲线实验报告_电化学扩散层,Cottrell equation,取样电流伏安法
  8. 【知识分享】异步调用与多线程的区别
  9. hibernate 调用oracle存储过程,hibernate调用oracle存储过程||函数
  10. 权威解读 GitHub、Apache 疑云:主流开源软件究竟是否会被闭源?| CSDN 独家
  11. 深度linux双显卡死机,Deepin配置IntelNvidia双显卡
  12. DPlayer.js视频播放插件
  13. html代码seo,SEO必学基础html代码基础
  14. 免费领7天腾讯视频VIP/优酷会员!
  15. 15ubuntu20.04离线安装openssh8.9.p1
  16. 这可能是你看到最详细的NCF代码讲解(1)数据处理篇
  17. 基于单片机的车内滞留儿童预警系统设计
  18. 根据excel模板导出
  19. python3爬取笔趣阁小说
  20. 经验分享|在龙芯2K上运行RT-Thread系统并开源

热门文章

  1. maven环境、本地仓储配置(下载安装)idea配置maven
  2. Kubernetes kubeadm 安装记录
  3. nodejs之querystring模块
  4. 欢迎访问我的博客园,希望对你有所帮助
  5. 2018.11.09 bzoj4773: 负环(倍增+floyd)
  6. 常用sql server 语句
  7. 2016年第5本:必然
  8. 【转】LoadRunner使用Libmemcached与Memcached通讯
  9. Verilog 常规数据定义
  10. 用 TStringList 模拟 将字符串转换为变量的功能 - 回复 flq_00000 和 外来天客 的问题...