`
hy2012_campus
  • 浏览: 30599 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

mysql锁相关介绍

 
阅读更多

msyql锁问题:

可以通过检查 table_locks_waited 和 table_locks_immediate 状态变量来分析系统上的表锁定争夺:

mysql> show status like 'Table%';

可以通过检查 Innodb_row_lock 状态变量来分析系统上的行锁的争夺情况:

mysql> show status like 'innodb_row_lock%';

 

什么情况下使用表锁:

表级锁在下列几种情况下比行级锁更优越:

1.  很多操作都是读表。

2.  在严格条件的索引上读取和更新,当更新或者删除可以用单独的索引来读取得到时:

3.  UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;

4.  DELETE FROM tbl_name WHERE unique_key_col=key_value;

5.  SELECT 和 INSERT 语句并发的执行,但是只有很少的 UPDATE 和 DELETE 语句。

6.  很多的扫描表和对全表的 GROUP BY 操作,但是没有任何写表。

什么情况下使用行锁:

行级锁定的优点:

1.  当在许多线程中访问不同的行时只存在少量锁定冲突。

2.  回滚时只有少量的更改。

3.  可以长时间锁定单一的行。

行级锁定的缺点:

1.  比页级或表级锁定占用更多的内存。

2.  当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。

3.  如果你在大部分数据上经常进行 GROUP BY 操作或者必须经常扫描整个表,比其它锁定明显慢很多。

4.  用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。

什么情况下使用表锁:

表级锁在下列几种情况下比行级锁更优越:

1.  很多操作都是读表。

2.  在严格条件的索引上读取和更新,当更新或者删除可以用单独的索引来读取得到时:

3.  UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;

4.  DELETE FROM tbl_name WHERE unique_key_col=key_value;

5.  SELECT 和 INSERT 语句并发的执行,但是只有很少的 UPDATE 和 DELETE 语句。

6.  很多的扫描表和对全表的 GROUP BY 操作,但是没有任何写表。

什么情况下使用行锁:

行级锁定的优点:

1.  当在许多线程中访问不同的行时只存在少量锁定冲突。

2.  回滚时只有少量的更改。

3.  可以长时间锁定单一的行。

行级锁定的缺点:

1.  比页级或表级锁定占用更多的内存。

2.  当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。

3.  如果你在大部分数据上经常进行 GROUP BY 操作或者必须经常扫描整个表,比其它锁定明显慢很多。

4.  用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。

当使用 insert...select...进行记录的插入时,如果 select 的表是 innodb 类型的,不论 insert 的表是什么类型的表,都会对 select 的表的纪录进行锁定。对于那些从 oracle 迁移过来的应用,需要特别的注意,因为 oracle 并不存在类似的问题,所以在 oracle 的应用中 insert...select...操作非常的常见。例如:有时候会对比较多的纪录进行统计分析,然后将统计的中间结果插入到另外一个表,这样的操作因为进行的非常少,所以可能并没有设置相应的索引。如果迁移到 mysql数据库后不进行相应的调整,那么在进行这个操作期间,对需要 select 的表实际上是进行的全表扫描导致的所有记录的锁定,将会对应用的其他操作造成非常严重的影

响。究其主要原因,是因为 mysql 在实现复制的机制时和 oracle 是不同的,如果不进行 select 表的锁定,则可能造成从数据库在恢复期间插入结果集的不同,造成主从数据的不一致。如果不采用主从复制,关闭binlog 并不能避免对 select 纪录的锁定,某些文档中提到可以通过设置 innodb_locks_unsafe_for_binlog 来避免这个现象,当这个参数设置为 true 的时候,将不会对 select 的结果集加锁,但是这样的设置将可能带来非常严重的隐患。如果使用这个 binlog 进行从数据库的恢复,或者进行主数据库的灾难恢复,都将可能和主数据库的执行效果不同。因此,我们并不推荐通过设置这个参数来避免 insert...select...导致的锁,如果需要进行可能会扫描大量数据的 insert...select 操作,我们推荐使用 select...into outfile 和 load data infile 的组合来实现,这样是不会对纪录进行锁定的。

如何减少锁的冲突:

1.  对 Myisam 类型的表:

 1)  Myisam 类型的表可以考虑通过改成 Innodb 类型的表来减少锁冲突。

 2)  根据应用的情况,尝试横向拆分成多个表或者改成 Myisam 分区对减少锁冲突也会

 有一定的帮助。

2.  对 Innodb 类型的表:

 1)  首先要确认,在对表获取行锁的时候,要尽量的使用索引检索纪录,如果没有使用

 索引访问,那么即便你只是要更新其中的一行纪录,也是全表锁定的。要确保 sql

 是使用索引来访问纪录的,必要的时候,请使用 explain 检查 sql 的执行计划,判

 断是否按照预期使用了索引。

 2)  由于 mysql 的行锁是针对索引加的锁,不是针对纪录加的锁,所以虽然是访问不同

 行的纪录,但是如果是相同的索引键,是会被加锁的。应用设计的时候也要注意,

 这里和 Oracle 有比较大的不同。

 3)  当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,当表有主

 键或者唯一索引的时候,不是必须使用主键或者唯一索引锁定纪录,其他普通索引

 同样可以用来检索纪录,并只锁定符合条件的行。

 4)  用 SHOW INNODB STATUS 来确定最后一个死锁的原因。查询的结果中,包括死锁的

 事务的详细信息,包括执行的 SQL 语句的内容,每个线程已经获得了什么锁,在等

 待什么锁,以及最后是哪个线程被回滚。详细的分析死锁产生的原因,可以通过改

 进程序有效的避免死锁的产生。

 5)  如果应用并不介意死锁的出现,那么可以在应用中对发现的死锁进行处理。

 6)  确定更合理的事务大小,小事务更少地倾向于冲突。

 7)  如果你正使用锁定读,(SELECT ... FOR UPDATE 或 ... LOCK IN SHARE MODE),

 试着用更低的隔离级别,比如 READ COMMITTED。

 8)  以固定的顺序访问你的表和行。则事务形成良好定义的查询并且没有死锁。

 

分享到:
评论

相关推荐

    MySQL锁详解

    接下来,将详细介绍MySQL中的不同类型的锁及其适用场景。 首先,MySQL的锁机制主要有表级锁、行级锁以及页面锁三种。不同的存储引擎对锁的支持也不同。MyISAM和MEMORY存储引擎使用表级锁,BDB存储引擎支持页面锁,...

    MYSQL锁表问题的解决方法

    本文将介绍几种解决MySQL锁表问题的方法。 1. **查看并杀死锁定进程** 使用`SHOW PROCESSLIST`命令可以查看当前所有正在执行的SQL语句及其状态,包括是否被锁定。如果发现有锁定的进程,可以使用`KILL`命令来终止...

    新版 MySQL DBA 高级视频 基于MySQL 5.7 MySQL 8.0版本.rar

    │ 3_MySQL锁相关参数设置.mp4 │ 4_InnoDB事务隔离级别详解.mp4 │ 5_InnoDB死锁发生原理和规避.mp4 │ 6_MySQL字符集和排序规则.mp4 │ 作业.docx │ 锁等待分析.txt │ ├─新版MySQL DBA综合实战班 第08天 │ 1...

    MySQL的基本介绍及优化实践.pptx

    #### 五、MySQL的相关规范 - **开发规范**:参考文档(http://wiki.missfresh.net/pages/viewpage.action?pageId=43456533),提供了关于数据库设计和使用的指导原则。 #### 六、MySQL的优化 - **慢查询原因**: ...

    MySQL的PPT文档

    ### MySQL相关知识点详解 #### 一、MySQL简介与基本概念 **数据库(Database)**:是一种按照特定数据结构来组织、存储和管理数据的仓库。它不仅存储数据本身,还包括这些数据之间的联系。 **关系型数据库**:是...

    MySQL5.7版本新特性介绍视频教程Mysql特性及版本介绍视频教程

    1初始化方式变更.mp41-2初始化方式变更实战演练.mp41-3旧版本支持为表增加计算列演练.mp41-4MySQL5.7支持为表增加计算列实际演练.mp41-5引入JSON列类型及相关函数.mp42-1支持多源复制.mp42-2基于库或是逻辑锁的多...

    MYSQL必会必知

    标题《MYSQL必会必知》指出了本文的重点在于介绍MySQL数据库的基础知识,强调了学习MySQL的必要性。描述部分重复强调了“mysql基础”,可能是由于文档错误,不过这仍然突出了本文的主旨:掌握MySQL的基础操作和概念...

    mysql5.6安装包 mysql5.6官网下载的

    虽然提供的信息较为简略,但基于这些信息,我们可以详细探讨MySQL 5.6的相关知识点,包括其安装过程、主要特性以及一些实用的操作技巧。 ### MySQL 5.6概述 MySQL是一种流行的开源关系型数据库管理系统(RDBMS),...

    MySQL性能调优与架构设计(中文版)

     7.3 合理利用锁机制优化MySQL  7.4 小结  第8章 MySQL数据库Query的优化  8.0 引言  8.1 理解MySQL的Query Optimizer  ……  第9章 MySQL数据库Schema设计的性能优化  第10章 MySQL Server性能优化 ...

    MySQL内核:InnoDB存储引擎 卷1.pdf

    《MySQL内核:InnoDB存储引擎 卷1》由资深MySQL专家,机工畅销图书作者亲自执笔,在以往出版的两本InnoDB介绍性图书的基础之上,更深入地介绍InnoDB存储引擎的内核,例如latch、B+树索引、事务、锁等,从源代码的...

    记录mysql的相关学习.zip

    - MySQL安装与配置:介绍如何在不同操作系统上安装MySQL服务器,并进行基本的配置,包括设置root用户密码、调整参数等。 2. **数据库设计** - 概念模型:理解实体-关系(E-R)模型,学习如何绘制E-R图来表达业务...

    mysql之innodb的锁分类介绍

    本文主要介绍InnoDB的三种行锁分类:记录锁、区间锁和Next-Key锁。 1. 记录锁(Record Lock):这是最基本的锁类型,只锁定单个数据行。当事务对某一行进行读写操作时,会施加记录锁,防止其他事务在同一时刻修改...

    mySQL笔记介绍

    删除数据库的同时也会删除与之相关的所有目录及其内容。 #### 四、表的操作 **创建表:** ```sql CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [库名.] 表名 (表的结构定义) [表选项]; ``` 表选项包括但不限于: ...

    MySQL十种锁,一篇文章带你全解析.doc

    MySQL数据库在处理多事务并发操作时,为了保证数据的完整性和一致性,采用了多种类型的锁机制。...如果你想要了解更多关于MySQL锁机制的深入内容,可以关注相关的技术博客或社区,如“一灯架构”,获取最新的技术干货。

    强昌金-揭秘MySQL OCP,全面掌握MySQL技术的最佳途径

    包括但不限于MySQL架构、系统管理、服务器配置、客户端和工具使用、数据类型、元数据获取、事务和锁、存储引擎、分区、用户管理、安全、表维护、数据导入导出、MySQL内部编程、备份与恢复、复制技术以及性能调优的...

    MySQL 叢集評估指南

    总体来看,MySQL集群评估指南为用户提供了从理论到实践的全面指导,不仅介绍了MySQL集群的基本概念和架构,还提供了实际操作中的评估策略、性能测试、故障排除等方面的详细知识,是数据库管理员和架构师在设计、部署...

    mysql高级优化查询

    通过上述对 MySQL 高级优化查询的深入解析,我们不仅了解了查询缓存的原理及其工作流程,还探讨了 MySQL 的内部机制,包括存储引擎、锁机制、索引管理和查询优化器等关键组件。此外,还介绍了一些额外的优化策略,如...

    mysql8.0.34

    以下将详细介绍 MySQL 8.0.34 的核心特性、改进和相关知识点。 1. **InnoDB 引擎优化**: - **原子性事务支持**:InnoDB 提供了ACID(原子性、一致性、隔离性和持久性)事务,确保数据的完整性和一致性。 - **...

Global site tag (gtag.js) - Google Analytics