InnoDB中,索引所扮演的角色是非常重要的。因为它们可以能让语句锁定更少的行。这是个要考虑的事情,因为在MySQL5.0 InnoDB中一个事物提前之前,是不会释放锁的。
如果查询语句不会检索它们不需要的行。它们将锁定更少的行。并且对于性能有提高,原因有二:首先,即使InnoDB行锁是非常有效率的并且使用更少的内存,但是行锁也会消耗一定的资源。其次,锁定很多的行就提高了锁的竞争并且降低了并发。
仅当InnoDB访问行的时候,才对它们加锁,并且一个索引可以降低InnoDB所要访问的行,因此也会降低锁。然而,这种情况只适用于在存储引擎级别中,InnoDB过滤了不期望的行。如果索引不允许InnoDB那么做,MySQL服务器就会在InnoDB取到这些值并且返回服务层之后,应用WHERE条件了。这种情况下,避免行的锁定就太晚了:InnoDB已经锁定了它们,并且服务器是不可能解锁的。
为了更好的理解我们看个例子,我们还是用以前的数据库Sakila
mysql> SET AUTOCOMMIT=0;
mysql> BEGIN;
mysql> SELECT actor_id FROM sakila.actor WHERE actor_id < 5
-> AND actor_id <> 1 FOR UPDATE;
+----------+
| actor_id |
+----------+
| 2 |
| 3 |
| 4 |
+----------+
这个查询返回了2到4行,但是实际上它已经获得了1到4行的独占锁。InnoDB锁定了第一行,因为这个语句是个索引范围读取:
mysql> EXPLAIN SELECT actor_id FROM sakila.actor
-> WHERE actor_id < 5 AND actor_id <> 1 FOR UPDATE;
+----+-------------+-------+-------+---------+--------------------------+
| id | select_type | table | type | key | Extra |
+----+-------------+-------+-------+---------+--------------------------+
| 1 | SIMPLE | actor | range | PRIMARY | Using where; Using index |
+----+-------------+-------+-------+---------+--------------------------+
换句话说,这个低级别的存储引擎操作是“从索引开始并且获取所有的行直到actor_id<5为false”。服务器是不会告诉InnoDB,WHERE actor_id <>1的条件。来看下EXTRA列的Using where。这就说明了在存储引擎返回行之后,MySQL服务器用WHERE进行了过滤。
下面的语句证明了第一行已经被锁了,即使它不会出现在第一个查询结果之中。丢掉第一个连接,开始第二个连接执行下列语句。
mysql> SET AUTOCOMMIT=0;
mysql> BEGIN;
mysql> SELECT actor_id FROM sakila.actor WHERE actor_id = 1 FOR UPDATE;
这个查询会被挂起。等待第一个事物是否第一行的锁。这个行为是为了保证基于语句级的复制是正确的。(在复制的一节会说道。)
就像这个例子所显示的,即使使用了索引,InnoDB还回会锁定它并不是真正需要的行。当不使用索引去查找和锁定行,这样的问题会更严重:如果这个语句没有索引,不管需不需要,MySQL都会扫描整张表并且锁定每个行。
下面谈一下InnoDB,索引和锁的一些鲜为人知的细节:InnoDB会把共享锁放置在次要索引上,但是独占锁需要访问主键。这就降低了使用覆盖索引的可能性并且会导致SELECT FOR UPDATE 慢于LOCK IN SHARE MODE 或者没有锁的查询。
分享到:
相关推荐
存储在介质上的数据的结构描述,含存储路径、存储方式、索引方式等 模式指全局模式 视图指外部视图 两层映像 E-C Mapping:External Schema-Conceptual Schema Mapping ----将外模式映射为概念模式,从而支持实现...
oracle创建表,索引,表空间,触发器,schema用户,序列的Sql文
5.3高性能的索引策略153 5.3.1独立的列153 5.3.2前缀索引和索引选择性153 5.3.3多列索引157 5.3.4选择合适的索引列顺序159 5.3.5聚簇索引162 5.3.6覆盖索引171 5.3.7使用索引扫描来做排序175 5.3.8压缩...
第1章 mysql 架构与历史 1 第2章 mysql 基准测试 35 第3章 服务器性能剖析 67 第4章 schema 与数据类型优化 111 第5章 创建高性能的索引 141 第6章 查询性能优化 195 第7章 mysql 高级特性 259 第8章 优化服务器设置...
同步新表同步轴向变动:添加,修改同步索引变动:添加,修改支持预览(只对比不同步变动)邮件通知变动结果支持屏蔽更新表,基线,索引,外键支持本地比线上额外的多一些表,分段,索引,外键安装去-u github....
第5章 创建高性能的索引 141 第6章 查询性能优化 195 第7章 mysql 高级特性 259 第8章 优化服务器设置 325 第9章 操作系统和硬件优化 377 第10章 复制 433 第11章 可扩展的mysql 501 第12章 高可用性 543 第13章 ...
第5章 创建高性能的索引 第6章 查询性能优化 第7章 MySQL 高级特性 第8章 优化服务器设置 第9章 操作系统和硬件优化 第10章 复制 第11章 可扩展的MySQL 第12章 高可用性 第13章 云端的MySQL 第14章 应用层...
高性能 Mysql免费下载,sql语句优化,索引建立,schema与数据库类型优化!
Solr 可以高亮显示搜索结果,通过索引复制来提高可用,性,提供一套强大 Data Schema 来定义字段,类型和设置文本分析,提供基于 Web 的管理界面等。 Key-Value Store Indexer 这个组件非常关键,是 Hbase 到 Solr ...
mySQL索引查看 select * from information_schema.statistics where table_schema='数据库名称' and table_name = '表名称'
两层映像 E-C Mapping:External Schema-Conceptual Schema Mapping ----将外模式映射为概念模式,从而支持实现数据概念视图向外部视图的转换 ----便于用户观察和使用 C-I Mapping:Conceptual Schema-Internal ...
第五章创建高性能索引;第六章查询性能优化;第七章mysql高级特性;第八章优化服务器设置;第九章操作系统和硬件优化;第十章复制;第十一章可扩展的mysql;第十二章高可用性;第十三章云端的mysql;第十四章应用层...
深度克隆并返回模式的副本,向该模式添加关键路径/模式类型对,您还可以添加另一个模式并复制所有路径、虚拟、getter、setter、索引、方法和静态。 特征: 深度克隆模式 复制路径、虚拟、getter、setter、索引、...
使用命令行可以轻松列出给定表的数据库表和列。 安装 您可以通过composer安装该软件包: composer require ohseesoftware/laravel-schema-list 用法 列出默认连接中的表: php artisan schema:tables 列出给定表...
CREATE INDEX --为数据库表创建一个索引 DROP INDEX --从数据库中删除索引 CREATE PROCEDURE --创建一个存储过程 DROP PROCEDURE --从数据库中删除存储过程 CREATE TRIGGER --创建一个触发器 DROP TRIGGER --...
SQL语句解释大全--从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 --数据定义 CREATE TABLE --创建一个数据库表 DROP TABLE --...
SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 --数据定义 CREATE TABLE --创建一个数据库表 DROP TABLE --从数据库...