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 或者没有锁的查询。
分享到:
相关推荐
性能监控和调优工具,如MySQL的Performance Schema和InnoDB Monitor,帮助识别性能瓶颈并优化数据库设置。 数据库连接字符串是用于连接数据库的应用程序配置,包含数据库地址、端口、用户名、密码等信息。 视图的...
- 将结构化的Table Schema数据高效地映射到Elasticsearch索引中。 - 定义数据模型,确保数据导入时遵循预设的结构。 - 实现数据的自动验证,防止不合规数据的输入。 - 提供简便的API,用于数据的插入、更新、查询和...
### 查看MySQL数据库索引 #### 一、基础概念与重要性 索引在数据库管理中扮演着极其重要的角色,特别是在提高数据检索速度方面。在MySQL数据库中,通过合理使用...这对于优化数据库性能和提高查询效率具有重要意义。
本文将深入探讨如何通过配置文件、查询优化、索引策略以及维护实践来优化MySQL的性能和管理。 首先,我们关注的是`my.cnf`配置文件。这是MySQL服务器的主要配置文件,用于设定数据库的各项运行参数。比如,可以通过...
在Oracle数据库管理中,SQL(Structured Query Language)是用于创建、操作和管理数据库的主要工具。以下将详细讲解标题和描述中涉及的各个知识点: 1. **创建表**:在Oracle中,使用`CREATE TABLE`语句来定义新的...
存储在介质上的数据的结构描述,含存储路径、存储方式、索引方式等 模式指全局模式 视图指外部视图 两层映像 E-C Mapping:External Schema-Conceptual Schema Mapping ----将外模式映射为概念模式,从而支持实现...
### MySQL性能优化教程知识点概述 #### 一、MySQL执行优化 **1.1 背景及目标** - **背景**: 针对已具备一定MySQL使用经验的工程师,特别是适用于高并发、海量数据处理的... - 持续监控和优化以保持系统高性能运行。
MySQL优化是数据库管理中的关键环节,它涉及到查询效率、存储空间和系统性能等多个方面。本文主要探讨了如何通过优化字段存储和使用索引来提升查询效率。 首先,索引对数据库性能有着显著影响。适当的索引可以大幅...
`scrape_schema_recipe-0.1.3-py2.py3-none-any.whl` 是一个针对Python开发者的库,主要用于后端数据抓取和结构化数据处理。这个库的名称暗示了它的主要功能可能与网络爬虫(scraping)和Schema.org标准有关,可能...
### 高效MySQL查询加速指南:索引策略、查询优化、性能调优 在数据库管理和开发领域中,MySQL因其灵活性和高效性而受到广泛欢迎。然而,在面对大规模数据集时,即使是性能强大的MySQL也可能遇到查询速度慢的问题。...
5. **验证和测试**:运行查询以确保立方体正确无误,并进行性能优化。 6. **报表创建**:在Pentaho BI Server上基于cube创建报表和仪表板。 ### 5. Schema_Workbench的最佳实践 - 遵循良好的数据仓库设计原则,如...
该工具能够提供详细的执行计划和优化过程信息,但需要注意的是,它可能会影响MySQL的性能,因此只应在临时调试时使用: 1. **启用Trace工具**: ```sql SET SESSION optimizer_trace="enabled=on", end_markers_in...
10. **监控和调整**:定期检查数据库性能,使用性能分析工具,如MySQL的Performance Schema,发现潜在的索引问题,并根据实际情况调整索引策略。 综上所述,优化MySQL索引的关键在于理解业务需求,结合查询模式和...
### DB2索引分析器使用详解 在DB2数据库系统中,索引是优化查询性能的关键因素之...需要注意的是,在实施任何由db2advis提出的建议之前,都应该对其进行彻底的测试,以确保不会对现有系统的稳定性和性能造成负面影响。
在MySQL中,索引的管理和创建是数据库性能优化的重要环节。NAVICAT是一款强大的数据库管理工具,支持多种数据库系统,包括MySQL,提供了一个直观的图形用户界面,使得数据库操作变得更为简单。 **创建索引** 1. **...
深入学习KVS-Schema的源码,我们可以了解到如何设计和实现一个支持Schema的键值存储系统,包括数据结构的设计、编译过程、验证逻辑、查询优化和实际的存储操作。这对于理解和优化分布式数据库系统、提升数据存储性能...
6. **性能调优实践**:除了理论知识,书中还提供了大量实战案例,帮助读者将所学应用到实际工作中,包括性能基准测试、故障排查和性能瓶颈分析。 《高性能MySQL》第二版是MySQL技术领域的经典之作,它将帮助读者...
- 在权衡数据完整性和性能时做出明智的选择。 4. **列索引** - 单个列上的索引是最常见的类型,了解何时以及如何创建这些索引可以显著提高查询性能。 5. **多列索引** - 当查询条件涉及多个列时,使用多列索引...