索引和锁可以让查询锁定更少的行。如果你的查询从不访问那些不需要访问的行,那么就会锁定更少的行,从两个方面来看这对性能都有好处。首先,虽然innodb的行锁效率很高,内存使用也很少,但是锁定行的时候仍然会带来额外的开销,其次,锁定超过需要的行会增加锁竞争,并减少并发性。

  innodb只有在访问行的时候才会对其加锁,而索引能够减少innodb访问的行数,从而减少锁的数量。但只有当innodb在存储引擎能够过滤掉不需要的行时才有效。如果索引无法过滤掉无效的行,那么在innodb检索到数据并返回给服务器层以后,MySQL服务器才能应用WHERE子句。这时候,已经无法避免锁定行了:inno代表可以在服务器端过滤掉行后就释放锁,但是在早期的MySQL版本中,innodb只有在事务提交后才能释放锁。

  通过下面的例子,很好的解释了这些情况

  SELECT actor_id FROM actor WHERE actor_id < 5 AND actor_id<>1 FOR UPDATE;

  这些表仅仅会返回2-4之间的行,但是实际上获取了1-4之间行的排他锁,innodb会锁住第一行,这是因为MySQL为该查询选择执行计划是索引范围扫描;换句话说,底层存储引擎操作的是“从索引的开头开始获取满足条件的actor_id<5的记录”服务器并没有告诉innodb可以过滤掉第一行的where条件。注意到explain的Extra列出现了“Using Where ” 这表示MySQL服务器将存储引擎返回行以后再应用where过滤条件。

  下面的第二个查询就可以证明第一行确实已经被锁定,尽管第一个查询的结果中并没有这个第一行。保持第一个连接打开,然后开启第二个连接并执行如下语句:

  SELECT actor_id FROM actor WHERE actor_id = 1 FOR UPDATE.

  这个查询就会被挂起,直到第一个事务释放第一行的锁。这个行为对于基于语句的复制的正常运行来说是必要的。

  就像这个例子显示的,即使使用了索引,innodb可能也会锁住一些不需要的数据。如果不能使用索引查找和锁定行的话问题可能会很糟糕,MySQL会做全表扫描并锁定所有的行,而不管是不是需要。

  关于innodb,索引和锁有一些很少有人知道的细节:innodb在二级索引上使用共享锁(读锁),但访问主键索引需要排他锁(写),这消除了使用覆盖索引的可能性,并且使得SELECT FOR UPDATE 比LOCK IN SHARE MODE  或非锁定查询要慢得多。

  

MySQL索引和锁的更多相关文章

  1. 对MySQL索引、锁及事务的简单分析

    一.索引的数据结构 1.二叉搜索树实现的索引 二叉搜索树如下图,它查找元素的时间复杂度为O(logn) 但如果经常出现增删操作,最后导致二叉搜索树变成线性的二叉树,这样它查找元素的时间复杂度就会变成O ...

  2. 【MySQL】索引和锁

    前言 本文摘自数据库两大神器[索引和锁] 声明:如果没有说明具体的数据库和存储引擎,默认指的是MySQL中的InnoDB存储引擎 索引 在之前,我对索引有以下的认知: 索引可以加快数据库的检索速度 表 ...

  3. Mysql数据库的数据类型、索引、锁、事务和视图

    Mysql数据库的数据类型.索引.锁.事务和视图 数据的类型 1)数据类型: 数据长什么样? 数据需要多少空间来存放? 系统内置数据类型和用户定义数据类型 2)MySql 支持多种列类型: 数值类型 ...

  4. 一步一步带你入门MySQL中的索引和锁 (转)

    出处: 一步一步带你入门MySQL中的索引和锁 索引 索引常见的几种类型 索引常见的类型有哈希索引,有序数组索引,二叉树索引,跳表等等.本文主要探讨 MySQL 的默认存储引擎 InnoDB 的索引结 ...

  5. mysql 索引优化 性能调优 锁

    1 检查mysql 是否安装 rpm -qa|grep -i mysql 2 ntsysv 查看和设置开机启动列表 3 mysql 在 centos 上默认 的数据目录是 /var/lib/mysql ...

  6. MySQL 核心三剑客 —— 索引、锁、事务

    一.常见存储引擎 1.1 InnoDB InnoDB 是 MySQL 5.5 之后默认的存储引擎,它具有高可靠.高性能的特点,主要具备以下优势: DML 操作完全遵循 ACID 模型,支持事务,支持崩 ...

  7. 【MySQL】MySQL(四)存储引擎、索引、锁、集群

    MySQL存储引擎 MySQL体系结构 体系结构的概念 任何一套系统当中,每个部件都能起到一定的作用! MySQL的体系结构 体系结构详解 客户端连接 支持接口:支持的客户端连接,例如C.Java.P ...

  8. mysql 行级锁的使用以及死锁的预防

    一.前言 mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务.使用mysql锁的时候有时候会出现死锁,要做好死锁的预防. 二.MySQL行级锁 行级锁又分共享锁和排他锁. 共 ...

  9. mysql事务和锁InnoDB

    背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...

随机推荐

  1. -_-#QUOTA_EXCEEDED_ERR: DOM Exception 22

    iOS的Safari在无痕模式下,sessionStorage操作产生异常,报错QUOTA_EXCEEDED_ERR: DOM Exception 22. html5 localStorage err ...

  2. loadrunner11 安装及破解教程来自百度文库

    http://wenku.baidu.com/link?url=wSdgdZPzSNkftIqPmuz2rLKJ0M7Q3RrfSEdqcoRzfVDMIikj_7OLmLZWgoCiBev3AxvN ...

  3. 130+ essential vim commands

    Basics :e filename Open filename for edition :w Save file :q Exit Vim :q! Quit without saving :x Wri ...

  4. Java学习日记-2.1 运算符

    1. 赋值运算符 赋值运算符是有值的 int i; System.out.println(i = 5); //输出5 正因为赋值运算符有值,所以可以可以连等地赋值 int j,k,l,m,n; j = ...

  5. VLC网页插件添加对火狐浏览器的支持

    原文转自:http://blog.csdn.net/gsls200808/article/details/25536113 1.用<embed>标签 下面这段代码只支持火狐,不支持IE & ...

  6. Context中嵌套<Environment>元素

    环境条目  可以在Context中嵌套<Environment>元素,配置命名的值,这些值作为环境条目资源(Environment Entry Resource),对整个web应用可见.比 ...

  7. redis常见错误

    1.Redis Error --MISCONF Redis is configured to save RDB snapshots省略 分析:(linux)未用root启动,用的app用户(没有最高权 ...

  8. JAVA-1-学习历程1:基础知识1

     前言:此文属于个人学习中总结记录的较重要的知识点,分享一下.望对刚開始学习的人有点用. 视频04   语句.函数.数组 1.函数的重载 2.数组内存空间的划分 栈.堆 视频05    数组 1. ...

  9. Android中的多媒体显示之图片缩放

    一:图片OOM异常: 代码示例: public class MainActivity extends Activity { private ImageView iv_imageView; protec ...

  10. PHP5.4的变化关注---What has changed in PHP 5.4.x(转)

    What has changed in PHP 5.4.x Most improvements in PHP 5.4.x have no impact on existing code. There ...