数据库索引实例之二consistent gets

简介:

数据来源

根据博客:某社区600万用户数据导入MYSQL、MSSQL、Oracle数据库方法,我们得到了一个含有600多万条用户数据的oracle数据库。本文就是根据这个来验证数据库索引的特性。

1.测试数据库CSDNUSER

View Code

数据导入方法参考某社区600万用户数据导入MYSQL、MSSQL、Oracle数据库方法

上述数据库包含主键索引,但是没有为主键命名,因此搜索该索引的等级BLEVEL,可以通过以下查询语句求出:

select index_name, blevel, num_rows from user_indexes where table_name = 'CSDNUSER'; 

查询结果如下图所示:

从上述查询结果中我们发现没有BLEVEL和NUM_ROWS。

1.未命名的主键

接下来我们查询ID>700万数据,之所以是700万是因为我们总共数据时600多万,这样可以更加明显的看出来有没有索引的查询效率。查询语句如下:

SET AUTOTRACE ON
SELECT * FROM CSDNUSER2 WHERE ID>7000000;

查询执行计划如下:

View Code

从统计信息中我们看出一共有“92  consistent gets”,相当于有92次IO。

2.无主键

然后我们删除上述主键SYS_COO38672,删除语句如下:

--删除主键
alter table csdnuser2 drop constraint SYS_C0038672;

再次执行上述查询语句,查询执行计划如下:

View Code

从统计信息中我们看出一共有“45129  consistent gets”,相当于有45129次IO。

3.添加命名主键

添加主键语句如下:

--添加主键
alter table csdnuser add constraint pk_csdnuser primary key(ID);

查询该索引的等级BLEVEL,可以通过以下查询语句求出:

select index_name, blevel, num_rows from user_indexes where table_name = 'CSDNUSER'; 

查询结果如下图所示:

从上述查询结果中我们发现BLEVEL:2和NUM_ROWS=6428632,为表中记录数。

再次执行上述查询语句,查询执行计划如下:

View Code

发现是“ 3  consistent gets”,表明添加命名索引以后,只需要3次IO就可以结束查询。

PS:2012-6-13解释前面错误理解

上述的命名主键与非命名主键的说法是错误的,第二次consistent gets子所以很大是因为删除了主键索引,这是没有错的。而第三次的consistent gets为3,而第一次consistent gets为92,并不说明自定义命名的索引效率比系统命名的索引效率高。之所以第三次只需要3次consistent gets是因为执行完第一次以后有缓存存在。假设在第一次查询以后再一次查询,那么统计结果跟第三次一模一样。

2.测试数据库USERINFO

http://www.itpub.net/thread-1313899-1-1.html

2.1创建数据库USERINFO

View Code

2.2创建序列

View Code

2.3插入100000条数据

View Code

2.4统计结果

查询NO=5000,查询语句如下:

View Code

第一次查询得到的统计信息:

View Code

第二次查询得到的统计信息:

View Code

第三次查询得到的统计信息:

View Code

为NO字段添加索引IX_USERINFO_NO

View Code

第四次查询得到的统计信息:

View Code

第五次查询得到的统计信息:

View Code

删除索引IX_USERINFO_NO

View Code

添加主键PK_USERINFO_NO

View Code

第六次查询得到的统计信息:

View Code

第七次查询得到的统计信息:

View Code

2.5统计分析

第一次到第三次查询,都是无索引状态下的查询,我们可以发现:

  1. 第一次查询时recursive calls=5>0,而后面两次recursive calls都为0,这个也适用于后期有索引的情况
  2. consistent gets在不断缩小,知道最后不变。例如第一次查询的consistent gets最大,而第二次和第三次的consistent gets相等。
  3. 在三次查询过程中,physical reads都为0。(physical reads=0表明物理IO次数为0,也就是说没有从硬盘上读取数据到内存中。之所以physical reads=0,是因为前面insert的100000数据已经在buffer_cache里了

第四次到第五次查询,都是有索引状态下的插叙,我们可以发现:

  1. consistent gets次数在下降,consistent gets最后变到4。
  2. recursive calls次数在下降,recursive calls最后变到0。
  3. 相对于第一次到第三次查询,consistent gets明显下降,这是因为添加了索引,前面第一次到第三次是全表扫描,而第四次跟第五次查询是索引扫描。逻辑读(consistent gets)之所以最后会是4,是因此需要读取根节点一个,分支一个,叶子一个,表块一个,共4个。
  4. physical reads同上。

从六次到第七次查询,是将原来索引换成了主键,我们可以发现:

  1. consistent gets最后降为3,而不是4,这个是不明白的地方。
  2. consistent gets同上
  3. recursive calls同上
  4. physical reads同上

主键也是索引的一种,只要加了索引,那么逻辑读(consistent gets)就明显降低,查询效率大大提高。这也是索引的作用。

2.6清空缓存后的physical reads

假设我们运行如下命令清空缓存:

alter system flush buffer_cache;
alter system flush shared_pool;

然后再次执行查询语句,得到的统计信息如下:

View Code

可以看到physical reads=308

再次执行查询语句,,得到的统计信息如下:

View Code

 

 本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/06/11/2545689.html,如需转载请自行联系原作者

目录
相关文章
|
24天前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
3月前
|
存储 关系型数据库 MySQL
MySQL数据库索引的数据结构?
MySQL中默认使用B+tree索引,它是一种多路平衡搜索树,具有树高较低、检索速度快的特点。所有数据存储在叶子节点,非叶子节点仅作索引,且叶子节点形成双向链表,便于区间查询。
108 4
|
2月前
|
存储 关系型数据库 MySQL
【赵渝强老师】MySQL数据库的多实例环境
MySQL多实例是指在一台服务器上运行多个MySQL服务,通过不同端口提供独立的数据服务。各实例共享安装程序,但使用各自的配置文件和数据文件,实现资源高效利用。本文详细介绍了如何通过“mysqld_multi”工具配置和启动多个MySQL实例,并演示了目录创建、初始化、配置文件修改及实例启动等操作步骤。
|
4月前
|
存储 算法 关系型数据库
数据库主键与索引详解
本文介绍了主键与索引的核心特性及其区别。主键具有唯一标识、数量限制、存储类型和自动排序等特点,用于确保数据完整性和提升查询效率;而索引通过特殊数据结构(如B+树、哈希)优化查询速度,适用于不同场景。文章分析了主键与索引的优劣、适用场景及工作原理,并对比两者在唯一性、数量限制、功能定位等方面的差异,为数据库设计提供指导。
|
11月前
|
数据库 索引
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
191 3
|
11月前
|
数据库 索引
深入理解数据库索引技术:回表与索引下推详解
【10月更文挑战第23天】 在数据库查询性能优化中,索引的使用是提升查询效率的关键。然而,并非所有的索引都能直接加速查询。本文将深入探讨两个重要的数据库索引技术:回表和索引下推,解释它们的概念、工作原理以及对性能的影响。
385 3
|
11月前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
7月前
|
存储 缓存 数据库
数据库索引采用B+树不采用B树的原因?
● B+树更便于遍历:由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。 ● B+树的磁盘读写代价更低:B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。 ● B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条
|
11月前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
234 61
|
11月前
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
386 57

热门文章

最新文章