`
风雪涟漪
  • 浏览: 506991 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9009
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18386
社区版块
存档分类
最新评论

Schema的优化和索引 - 高性能的索引策略 - 冗余和重复的索引

阅读更多

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操作性能影响很大,尤其是新的索引达到了内存的限制。

 

 

 

 

 

 

1
0
分享到:
评论

相关推荐

    mysql面试题-mysql经典面试题目-数据库的基本概念-SQL语法-事务处理-索引优化-性能调优-mysql-面试题目

    性能监控和调优工具,如MySQL的Performance Schema和InnoDB Monitor,帮助识别性能瓶颈并优化数据库设置。 数据库连接字符串是用于连接数据库的应用程序配置,包含数据库地址、端口、用户名、密码等信息。 视图的...

    详解mysql中的冗余和重复索引

    MySQL中的冗余和重复索引是数据库管理中需要...在实际操作中,应根据查询模式和性能需求来平衡索引的创建和删除,同时利用专业工具进行检查和优化。这不仅可以节省存储空间,还能提高查询速度,从而提升整体系统性能。

    Mysql性能优化教程.doc

    ### MySQL性能优化教程知识点概述 #### 一、MySQL执行优化 **1.1 背景及目标** - **背景**: 针对已具备一定MySQL使用经验的工程师,特别是适用于高并发、海量数据处理的... - 持续监控和优化以保持系统高性能运行。

    Mysql优化选择最佳索引的方法共2页.pdf.zip

    10. **监控和调整**:定期检查数据库性能,使用性能分析工具,如MySQL的Performance Schema,发现潜在的索引问题,并根据实际情况调整索引策略。 综上所述,优化MySQL索引的关键在于理解业务需求,结合查询模式和...

    高效MySQL查询加速指南:索引策略、查询优化、性能调优,助力数据库管理员和开发者突破性能瓶颈

    ### 高效MySQL查询加速指南:索引策略、查询优化、性能调优 在数据库管理和开发领域中,MySQL因其灵活性和高效性而受到广泛欢迎。然而,在面对大规模数据集时,即使是性能强大的MySQL也可能遇到查询速度慢的问题。...

    高性能MySQL(第3版).part2

    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源码.rar

    深入学习MySQL源码,不仅能帮助我们理解数据库内部运作机制,还可以让我们更好地针对特定场景进行定制化开发和性能优化,解决实际问题。例如,通过源码分析,开发者可以了解SQL执行的详细过程,优化查询语句;或者...

    2011Esri中国用户大会-企业级空间数据库管理策略

    - 对表结构进行优化,如添加索引、减少冗余字段等。 4. **查询优化**: - 改进查询语句,减少不必要的数据加载和处理。 #### 结论 通过对2011年Esri中国用户大会上提出的“企业级空间数据库管理策略”的深入解析...

    Mysql性能优化教程

    **优化实战范例**中,我们可以学习如何为经常用于查询的列创建索引,如何避免在WHERE子句中使用不等操作符和函数,以及如何合理设计数据库表结构,如避免数据冗余,确保数据的一致性。 **认识影响结果集**,我们...

    高性能MySQL 第三版读书笔记 一至六

    【高性能MySQL 第三版读书笔记 一至六】主要涵盖了...以上是高性能MySQL的关键概念和实践,每个主题都可以深入研究,以适应不同的应用场景和性能需求。理解并有效应用这些知识点对于优化MySQL的性能和稳定性至关重要。

    高性能MySQL(第3版)

    这本书详细讲解了SQL语句的优化策略、索引的创建与管理、以及如何根据具体业务需求选择合适的schema和数据库类型。以下是对这些知识点的详细解析: 一、SQL语句优化 在MySQL中,SQL语句的性能优化是提升数据库整体...

    高性能的mysql

    《高性能的MySQL》一书是数据库管理员和开发者的宝贵资源,专注于MySQL的性能优化和高效使用。这本书的第三版深入探讨了MySQL的各种方面,包括事务处理、存储引擎、主从复制等关键主题,旨在帮助读者构建和维护高...

    基于solr的网站索引架构(一)

    通过Sharding和Replication,可以实现负载均衡和数据冗余,提高系统的可用性和性能。 8. **优化与调优**: 在实际应用中,我们需要不断优化索引和查询性能。这可能涉及到调整Solr的配置参数,如缓存大小、并发设置...

    MySQL高性能优化规范建议

    5. **谨慎使用分区表**:分区表在特定场景下有益,但过度使用可能导致复杂性和性能下降。 6. **冷热数据分离**:将不常访问的历史数据移到冷存储,减少表宽度,优化I/O。 7. **避免预留字段**:保持数据模型清晰,...

    从零开始带你成为MySQL实战优化高手PDF64-116.zip

    首先,优化通常分为两个主要方面:SQL查询优化和系统配置优化。在SQL查询优化中,你将学习如何编写高效的查询语句,避免全表扫描,利用索引进行快速查找,以及理解和使用EXPLAIN分析查询执行计划。这部分内容可能会...

    MySQL性能优化

    MySQL性能优化是一个涵盖广泛的主题,涉及数据库架构设计、查询优化、索引策略、存储引擎选择、资源管理和配置等多个方面。以下是一些关键知识点的详细解释: 1. **查询优化**: - **EXPLAIN分析**:通过EXPLAIN...

    很好的sql优化性能方法

    SQL优化是数据库管理中至关重要的一个环节,它旨在提高查询速度、减少资源消耗,从而提升...通过深入理解数据库工作原理,结合实际业务需求,我们可以制定出针对性的优化策略,显著提高SQL查询效率,提升整体系统性能。

Global site tag (gtag.js) - Google Analytics