索引是一种有效的查询加速策略。索引可以在以下情况下加速:
1、索引可以有效地避免全表扫描。
2、非聚集索引在某些情况甚至可以不访问数据表。(聚集索引索引和数据表混生)。
3、聚集索引可以有效地避免所有的插入都发生在数据表的尾部。
4、部分查询可以有效地利用B-Tree索引的有序性,避免排序操作。
索引是如何组织的?如何在查询中有效利用索引?
数据库的索引可分为聚集索引与非聚集索引。聚集索引将数据存储与索引组织统一,索引的叶子节点即是数据存储页。非聚集疏索引的叶子节点存储的是数据存储位置的指针。
聚集索引的存储形式如下:
在查找greene时,先比较索引页1001中,在bennet与karsen之间,到bennet的指向的索引页中1007,在索引页1007中查得greene的的位置为索引页(也是数据 页)1133,再去1133去比对查询。在查找的过程中,因为记录的是数据的页而不是准确存储位置,发生了两次页内的扫描。
在插入新数据greens时,索引需要先查找出对应的页为1133,然后在相应页进行添加。如若数据页的过大,即,可能会造成页内的扫描成本过高,需要对数据页进行分割。分割的过程需要对父辈的索引进行调整,需要对同辈的数据进行挪动,成本较高,且数据插入的过程,需要先查找判定合适插入位置。所以,使用聚集索引的表,在发生数据页分页时,插入操作可能是一个消耗比较大的操作。
在删除数据greene时,在判定位置页1133后,直接删除对应的数据即可,然后调整页1007索引位置,维护索引的代价较低。
非聚集索引的存储形式如下:
在查找greene是,在索引页查找greene的位置在bennet后,bennet指向的下一个索引页为1007,在页1007中扫描,得到在地址为数据页1307,偏移位置为4的位置出现了一次,但是继续扫描索引(在为主键或者Unique时可以停止),其指向的下一个索引页为1133,扫描索引,得到位置为数据页1307偏移2的位置和数据页1409偏移2的位置。
在插入新数据greens时,直接在最后数据页1409插入新数据(在数据页达到指定大小的时候创建新页)。然后调整索引,修正索引页1133。
在删除数据greene时,在查找判定位置删除后,维护索引需要对页1007和1133进行修正,代价较大(依旧是很小的代价)。
在上述过程中,聚集索引和非聚集索引的可能会带来的性能差别主要在插入时。但是不可忽视的一个重大区别是:聚集索引的“数据页”是有序的,而非聚集索引的索引页有序而数据页无序!这意味着在查找的时候,聚集索引可以高效地地预读,可以有效地减少磁盘IO。而且,聚集索引将数据的有序组织可以避免新插入数据聚集在最末尾的情况?(有何好处?不同位置并发插入不是有磁盘IO的限制,还是一起插入在最末尾速度比较快吧?)
使用聚集索引建表,如果要在非主键列建立索引,称为第二索引,其组织形式为非聚集索引。
因为索引包含了一部分数据信息,并且是有序的,所以索引在部分情况下可以避免对数据库表的访问和避免排序。如查找以g开头的人名并排序这个需求就可以直接利用索引完成。
除利用B-Tree的索引之外,还可以利用哈希表可构造索引。哈希索引的一个优点是只保留了简短的哈希值,所以索引特别紧凑。本质上,B-tree支持使用前缀的查询,索引里依旧存储了被建立索引的值。哈希索引,因为哈希计算的单向性,且计算结果顺序不可控,不支持需要顺序支持的一些操作。支持哈希索引的引擎有:Memory和NDB Cluster。InnoDB在索引被频繁访问的时候,会在B-Tree的顶端为索引建立在内存中的哈希索引,这个过程由引擎自动完成,不可控。可以使用Hash计算实现一个伪哈希索引,使用触发器对伪哈希索引列进行维护。 查询时使用哈希值和原值。这样做,可以减小索引的大小。
有效地利用索引。有效地利用索引可以在查询时减少大量的表扫描。如select × from table where name like 'g*' and sex = 'female' 如果调整为 select × from table where sex = 'female' and name like g* 。因为SQL是自右向左进行解析,可以先利用索引筛选掉大批数据,而不是直接进行表扫描筛选性别,而且性别的选择性比较差。
- 大小: 59.8 KB
- 大小: 42.1 KB
分享到:
相关推荐
《高性能Mysql》第五章的读书笔记,记录的都是要点,以思维导图的方式呈现。
【高性能MySQL笔记-总结】 MySQL作为一款广泛应用的关系型数据库管理系统,因其开源、免费且性能卓越的特性,在互联网行业中被广泛采用。本笔记旨在系统性地介绍MySQL的基础知识、性能优化及实战案例,帮助读者深入...
### 高性能MySQL学习笔记:查询性能优化与实践 #### 一、查询性能低下的原因与分析步骤 查询性能低下通常归因于访问了过多的数据。优化查询性能的关键在于识别并减少不必要的数据访问。具体可以通过以下两个步骤...
本篇学习笔记将深入探讨如何通过索引优化、查询优化以及缓存利用等多种技术手段来提升MySQL数据库的性能,并介绍数据库的扩展策略(包括垂直扩展和水平扩展)以支持更高的并发量和更大的数据规模。 #### 性能优化 ...
索引可以包含一个或多个列的值,如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀。创建一个包含两个列的索引,和创建两个包含只包含一列的索引是大不相同的。
本笔记将深入探讨MySQL中的索引使用,旨在帮助你提升数据库性能。 1. 索引的概念与类型: - 索引是一种数据结构,用于快速定位表中的特定行,类似于书籍的目录。 - MySQL支持多种类型的索引,包括B-Tree(默认)...
- 性能高:MySQL以其高效的数据处理能力和稳定性而著称。 - 简单易用:安装和使用过程相对简单,便于快速部署。 ##### MySQL的安装 - **安装方式**:MySQL提供两种主要类型的DBMS:基于共享文件系统的DBMS(如...
【高性能MySQL 第三版读书笔记 一至六】主要涵盖了MySQL服务器优化、操作系统和硬件优化、复制技术、可扩展性方案、MySQL分支与变种以及高可用性策略等多个方面。以下是对这些知识点的详细说明: 1. **优化服务器...
`时,如果只有一个单列索引在`vc_Name`上,MySQL会首先找到所有名字为“erquan”的记录,然后对这些结果进行二次过滤,检查城市和年龄。而如果有组合索引`(vc_Name, vc_City, i_Age)`,则可以直接定位到符合条件的...
《高性能MySQL学习笔记》是一份全面探讨MySQL数据库优化与高效运用的资料集合,旨在帮助读者深入理解MySQL的内部机制,并掌握提升数据库性能的各种策略和技术。这份笔记可能包含了多个章节,涵盖了从基础概念到高级...
4. **索引和优化**:了解索引的作用,学习创建和管理不同类型的索引(如B树、哈希等),以及如何优化查询性能。 5. **存储过程和函数**:学习编写存储过程和自定义函数,提高代码复用性和效率。 6. **视图和触发器...
此外,还会涉及表的结构设计,如数据类型选择、主键和外键的概念、索引的使用,以及如何优化查询性能。 书中的实战部分可能涵盖实际项目中的案例,比如创建一个简单的员工信息系统,通过SQL语句实现数据的增删改查...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,其底层原理对于数据库管理员和开发人员来说至关重要,能够帮助他们优化查询性能,理解事务处理,以及更好地管理数据存储。以下是对标题和描述中涉及知识点的详细...
本教程笔记涵盖了 MySQL 的一些高级主题,包括用户权限管理、日志管理、主从复制、分区技术和性能优化等方面。这些内容对于数据库管理员和开发者来说都是非常重要的知识。掌握这些技能有助于提高系统的稳定性和性能...
- **行级锁定**:与表级锁定相比,行级锁定能提供更高的并发性能,允许不同用户同时修改表的不同部分。 - **外键约束**:InnoDB支持外键,用于维护引用完整性和数据关联性,是关系数据库设计中的关键元素。 - **...
### MySQL入门很简单—学习笔记知识点总结 #### 一、数据库概述 **1.1 数据存储方式** - **文件系统**:传统的数据存储方式,通过文件和文件夹组织数据。 - **数据库系统**:通过数据库管理系统(DBMS)进行数据...
《高性能MySQL》是数据库管理员、开发人员和系统架构师必备的一本经典著作,它深入探讨了MySQL的各个方面,包括性能优化、高可用性、备份、恢复、复制和安全性等。这本书的第三版更是包含了最新的MySQL技术和最佳...
尚硅谷的MySQL笔记可能是为了帮助学习者深入理解和掌握MySQL的相关知识而编写的。这份笔记可能包含了从基础概念到高级特性的全面讲解,包括但不限于SQL语言、数据类型、数据库设计、索引、事务处理、视图、存储过程...