MySQL可以在一个列上创建多个索引;这么做并不会提醒和防止发生错误。MySQL必须单独维护每一个重复的索引,当语句优化器优化语句的时候,它会参考这些索引。这样会对性能造成影响。
重复的索引是那些具有相同类型,在同顺序下的相同一组索引。你应该避免这样来创建它们并且如果发现它们要尽早的删除。
有的时候你可能在不知道的情况下就创建了重复索引。比如,如下的代码
CREATE TABLE test (
ID INT NOT NULL PRIMARY KEY,
UNIQUE(ID),
INDEX(ID)
);
一个没有经验的用户可能想到要使列的作为主键,要加上一个UNIQUE约束,并且添加一个索引。事实上,MySQL实现了UNIQUE约束和PRIMARY KEY索引。因此实际上,在一个列上已经创建了三个索引了。没有必要这样做,除非你要在同样的列上创建不同类型的索引来满足不同类型的查询。
冗余的索引和重复的索引有所不同。如果在(A,B)上有个索引,另一个在(A)上的索引就是冗余的。因为它是第一个索引的前缀。(A,B)上的索引也可以当作(A)上的索引来单独使用。然而,一个(B,A)上的索引就不冗余,(B)上的索引也是不冗余的,因为它并不是(A,B)索引的前缀。进一步的说,不同的索引类型对于B-Tree索引都不是冗余的,不管它们所覆盖的列是怎样。
当人们添加索引的时候,经常会出现冗余索引。比如,有的人在(A,B)添加了索引,用来取代扩展现有(A)的索引。
大部分的情况,你都不会想要冗余索引,并且要避免它们,你应该扩展现有索引而不是添加一个新的。也有的时候可能因为性能的原因你需要使用冗余索引。使用冗余索引的主要原因就是当扩展现有的索引,这个冗余索引会使它变得更大一些。
举个例子,如果你有一个在整型列上的索引并且你扩展为这个整型列和一个VARCHAR列上的索引,它会变慢。如果你的查询覆盖了这个索引,或者如果表是MyISAM的以及需要范围扫描(因为MyISAM使用前缀压缩),变慢的情况就会发生。
考虑下userinfo表。在前面的教程中所提到过。这个表有1,000,000行并且每个state_id有20,000记录。有个索引在state_id上。这对下列的查询很有用。Q1语句如下:
mysql> SELECT count(*) FROM userinfo WHERE state_id=5;
一个简单的基准测试显示执行率是每秒115条(QPS)。我们在看看相关查询Q2。
mysql> SELECT state_id, city, address FROM userinfo WHERE state_id=5;
对于这个查询,结果少于10QPS.简单的性能提高方法就是扩展索引(state_id, city, address)。因此索引覆盖了查询。
mysql> ALTER TABLE userinfo DROP KEY state_id,
-> ADD KEY state_id_2 (state_id, city, address);
在修改索引之后,Q2变快了,Q1却慢了。如果我们想让两个查询都快的话,我们应该留下这两个索引,即使那个单独的索引是冗余的。下面的表给出了在MyISAM和INNODB中这两个索引的表现。注意在使用state_id2索引的时候,InnoDB的Q1并没有降低多少性能,因为InnoDB没有键压缩。
state_id only state_id_2 only Both state_id and state_id_2
MyISAM, Q1 114.96 25.40 112.19
MyISAM, Q2 9.97 16.34 16.37
InnoDB, Q1 108.55 100.33 107.97
InnoDB, Q2 12.12 28.04 28.06
同时使用两个索引的缺点是维护消耗大。下面的数据是插入1百万行性能。
state_id only Both state_id and state_id_2
InnoDB, enough memory for both indexes 80 seconds 136 seconds
MyISAM, enough memory for only one index 72 seconds 470 seconds
你也看到了,插入数据的性能很差。一般来说如下说法是正确的:添加一个索引会对INSERT,UPDATE,DELETE操作性能影响很大,尤其是新的索引达到了内存的限制。
分享到:
相关推荐
性能监控和调优工具,如MySQL的Performance Schema和InnoDB Monitor,帮助识别性能瓶颈并优化数据库设置。 数据库连接字符串是用于连接数据库的应用程序配置,包含数据库地址、端口、用户名、密码等信息。 视图的...
MySQL中的冗余和重复索引是数据库管理中需要...在实际操作中,应根据查询模式和性能需求来平衡索引的创建和删除,同时利用专业工具进行检查和优化。这不仅可以节省存储空间,还能提高查询速度,从而提升整体系统性能。
### MySQL性能优化教程知识点概述 #### 一、MySQL执行优化 **1.1 背景及目标** - **背景**: 针对已具备一定MySQL使用经验的工程师,特别是适用于高并发、海量数据处理的... - 持续监控和优化以保持系统高性能运行。
10. **监控和调整**:定期检查数据库性能,使用性能分析工具,如MySQL的Performance Schema,发现潜在的索引问题,并根据实际情况调整索引策略。 综上所述,优化MySQL索引的关键在于理解业务需求,结合查询模式和...
### 高效MySQL查询加速指南:索引策略、查询优化、性能调优 在数据库管理和开发领域中,MySQL因其灵活性和高效性而受到广泛欢迎。然而,在面对大规模数据集时,即使是性能强大的MySQL也可能遇到查询速度慢的问题。...
5.3.9冗余和重复索引178 5.3.10未使用的索引181 5.3.11索引和锁181 5.4索引案例学习183 5.4.1支持多种过滤条件183 5.4.2避免多个范围条件185 5.4.3优化排序186 5.5维护索引和表187 5.5.1找到并修复损坏的表...
深入学习MySQL源码,不仅能帮助我们理解数据库内部运作机制,还可以让我们更好地针对特定场景进行定制化开发和性能优化,解决实际问题。例如,通过源码分析,开发者可以了解SQL执行的详细过程,优化查询语句;或者...
- 对表结构进行优化,如添加索引、减少冗余字段等。 4. **查询优化**: - 改进查询语句,减少不必要的数据加载和处理。 #### 结论 通过对2011年Esri中国用户大会上提出的“企业级空间数据库管理策略”的深入解析...
**优化实战范例**中,我们可以学习如何为经常用于查询的列创建索引,如何避免在WHERE子句中使用不等操作符和函数,以及如何合理设计数据库表结构,如避免数据冗余,确保数据的一致性。 **认识影响结果集**,我们...
【高性能MySQL 第三版读书笔记 一至六】主要涵盖了...以上是高性能MySQL的关键概念和实践,每个主题都可以深入研究,以适应不同的应用场景和性能需求。理解并有效应用这些知识点对于优化MySQL的性能和稳定性至关重要。
这本书详细讲解了SQL语句的优化策略、索引的创建与管理、以及如何根据具体业务需求选择合适的schema和数据库类型。以下是对这些知识点的详细解析: 一、SQL语句优化 在MySQL中,SQL语句的性能优化是提升数据库整体...
《高性能的MySQL》一书是数据库管理员和开发者的宝贵资源,专注于MySQL的性能优化和高效使用。这本书的第三版深入探讨了MySQL的各种方面,包括事务处理、存储引擎、主从复制等关键主题,旨在帮助读者构建和维护高...
通过Sharding和Replication,可以实现负载均衡和数据冗余,提高系统的可用性和性能。 8. **优化与调优**: 在实际应用中,我们需要不断优化索引和查询性能。这可能涉及到调整Solr的配置参数,如缓存大小、并发设置...
5. **谨慎使用分区表**:分区表在特定场景下有益,但过度使用可能导致复杂性和性能下降。 6. **冷热数据分离**:将不常访问的历史数据移到冷存储,减少表宽度,优化I/O。 7. **避免预留字段**:保持数据模型清晰,...
首先,优化通常分为两个主要方面:SQL查询优化和系统配置优化。在SQL查询优化中,你将学习如何编写高效的查询语句,避免全表扫描,利用索引进行快速查找,以及理解和使用EXPLAIN分析查询执行计划。这部分内容可能会...
MySQL性能优化是一个涵盖广泛的主题,涉及数据库架构设计、查询优化、索引策略、存储引擎选择、资源管理和配置等多个方面。以下是一些关键知识点的详细解释: 1. **查询优化**: - **EXPLAIN分析**:通过EXPLAIN...
SQL优化是数据库管理中至关重要的一个环节,它旨在提高查询速度、减少资源消耗,从而提升...通过深入理解数据库工作原理,结合实际业务需求,我们可以制定出针对性的优化策略,显著提高SQL查询效率,提升整体系统性能。