数据库第四章索引与查询优化

索引

索引:

  • 一种辅助的数据结构,记录了快速数据存取路径;
  • 可以极大加快主表数据存取速度;
  • 索引文件记录的结构:索引值+指针。

多级索引:数据记录数量庞大的情况下,单级索引效率太低,采用多级索引可以大大提高速度

B+树索引

数据库系统中使用最广泛的多级索引;

特点:

  • 将数据存储块组织成一棵树;
  • 这棵树是平衡的,即从树根到树叶的所有路径一样长;
  • 通常B+数有三层:根、中间层和叶,当然也可以为任意层;
  • 最底层的叶节点包含每个索引键和指向被索引行的行id;
  • 叶节点之间有通道可供平行查询;
  • 每一个叶节点都和磁盘页面大小一致。
B+树索引实例

B+树插入操作

B+树的插入删除不会引起过多的I/O操作;

插入之后B+树依然是平衡的,并保持了很好的性能;

插入过程:

  • 设法再适当的叶结点中为新键找到空闲空间,如果有的话,就把键放在那里;
  • 如果在适当的叶结点中没有空间,就把该叶结点分裂成两个,并且把其中的键分到这两个新结点中,使每个新节点有一半或刚好超过一半的键;
  • 某一层的结点分裂从上一层的角度看来,相当于是要在这一较高的层次上插入一个新的键-指针对;如果有空间,则插入,没有空间就分裂这个父结点并且继续向树的高层推进;
  • 例外的情况是,如果试图插入键到根结点中并且根节点没有空间,那么我们就分裂根节点成两个结点,且在更上一层创建一个新的结点,这个新的根结点有两个刚分裂成的结点作为他的子结点。

插入实例:

插入之前
插入之初

 

插入之后

B+树用一个链表存储重复的键值对应记录行的RID的值:

 

B+树索引特点

 效率:

  • 一般B+树保持在3层,这意味着只需三次磁盘I/O即可获得数据的物理存储地址;
  • 若将B+树的根结点和中间节点存入缓存,则只需一次磁盘I/O就能读取数据。

使用场景:

  • 大部分情况下B+树索引都能工作得很好;
  • 当要访问的记录数战记录总数的百分比非常大的时候,不用索引将比用索引更快。

散列索引

B+树索引需要三次左右磁盘I/O才能查到数据记录;

散列索引只需一次磁盘I/O就可以查到数据记录;

散列索引:根据给定索引值,用一种算法将记录分散存储在多个桶中(一般一个桶就是一个数据块,块中内容用一次磁盘操作就可以读取到内存中),当腰查找记录时,用相同算法算出该记录所在的桶,读取整个桶的数据到内存中,然后再桶中顺序查找要找的记录。

散列索引实例

如果桶的数量足够多,则每个桶通常占用一个磁盘页面(块);

如果记录数很多,则会出现一个块中容纳不下新纪录的情况,这时可以增加一个溢出块到桶的链上。

散列索引特征 

特点:

  • 散列索引是CPU密集型的,B+索引是I/O密集型的;
  • 散列索引很紧凑,速度很快;
  • 散列索引无法用于排序;
  • 只支持等值查找,不支持范围查找;
  • 不适合在重复值很多的列上建立哈希索引。

聚簇索引

聚簇索引:大多数关系表以堆组织表的形式存放;

  • 堆:一块大的空间,供随机存放数据;
  • 对组织表:一个大而无序的数据记录行的集合:① 行随机存放在任意一个能容纳他的位置上;② 行读取的顺序是不可预测的;

建立聚簇索引后,数据在物理文件中的存放位置不再是无序的,而是根据索引中键值的逻辑顺序决定了表中相应行的物理顺序。

非聚簇索引和聚簇索引的比较

聚簇索引特点

特点:

  • 物理顺序只有一个,因此一张表只有一个聚簇索引;
  • 在聚簇索引列上的查询速度比B+索引快;
  • 数据在物理上按顺序排在数据页上,重复值页排在一起,因而在使用包含范围检查或使用group by或order by的查询时,可以大大提高查询速度;
  • DML频繁的表不要建立聚簇索引,因为会带来大量数据维护的开销。

其他索引

其他索引类型:位图索引、函数索引、反序索引...

索引会带来维护开销,因此只在经常被作为查询条件的字段上或是确实需要提升查询性能的字段上建立索引。

针对不同的数据情况选择合适的索引类型,考虑因素如:

  • 重复值占比;
  • 列值是否被频繁更新;
  • 是否范围查询或分组查询

查询优化

我们先来看一下SQL语句的执行过程,就能理解查询优化起作用的范围和作用。

优化准则

查询优化一般准则: 

  • 选择运算尽可能先做(减少中间关系)
  • 在执行连接操作前对关系适当进行预处理:按连接属性排序,在连接属性上建立索引
  • 投影运算和选择运算同时做(避免重复扫描关系)
  • 将投影运算与其前面或后面的双目运算结合(减少扫描关系的次数)
  • 提取公共子表达式

优化过程

查询优化的一般过程:

  • 将查询转换成某种内部表示,通常是语法树;
  • 根据一定的等价变换规则把语法树转换成标准(优化)形式(代数优化)
  • 选择低层的操作算法(物理优化):① 对于语法树的每一个操作计算各种执行算法的执行代价;② 选择代价小的执行算法;
  • 生成查询计划(查询执行方案)

优化实例

例:求选修了课程2的学生姓名

SELECT Student.Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno
AND SC.Cno='2';

(1)把查询转换成某种内部表示

语法树

 

(2)代数优化

利用优化算法把语法树转换成标准(优化)形式

 (3)物理优化

选择低层的存取路径:

  • 优化器查找数据字典获得当前数据库状态信息:① 选择字段上是否有索引,② 连接的两个表是否有序,③ 连接字段上是否有索引;
  • 然后根据一定的优化规则选择存取路径;

(4)生成查询计划

选取代价最小的查询计划:

  • 在做连接运算时,若两个表(设为R1,R2)均无序,连接属性上页没有索引,则可以有下面几种查询计划:① 对两个表做排序预处理,② 对R1在连接属性上建索引,③ 对R2在连接属性上建索引,④在R1,R2的连接属性上均建索引;
  • 对不同的查询计划计算代价,选择代价最小的一个。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java中循环条件的数据库查询可以通过以下几种方法来优化: 1. 减少数据库请求的次数:尽量减少对数据库的询问,可以将所需的多个数据请求合并为一次请求。 2. 使用缓存:对于常用的数据可以使用缓存,减少对数据库的询问。 3. 使用索引:对查询的字段建立索引,可以提高查询速度。 4. 使用预处理语句:使用预处理语句可以提高数据库查询的效率。 5. 使用连接池:使用连接池可以避免频繁地打开和关闭数据库连接,提高数据库访问的效率。 6. 使用简单的SQL语句:使用简单的SQL语句可以减少数据库的处理量,提高查询效率。 ### 回答2: 在进行Java循环条件数据库查询优化时,有以下几个方面可以考虑: 1.缩小查询结果集:尽量在查询条件中加入更多的限制条件,如使用索引、使用更精确的条件等,以减少返回的数据量,从而提高查询速度。 2.合理使用缓存:在查询过程中,可以尝试使用缓存来存储已查询的数据,避免多次查询相同的数据,从而减少数据库的访问次数。 3.批量操作:对于需要进行批量查询的情况,可以考虑使用批量操作,将多个查询请求合并为一个请求,减少与数据库的交互次数,提高效率。 4.适当使用连接池:连接池可以帮助管理数据库连接,减少连接的创建和销毁开销,提高数据库访问的效率。 5.优化SQL语句:尽量避免使用复杂的SQL语句,可以使用数据库查询优化工具或者调整查询语句的结构,以提高查询的效率。 6.合理设计数据库表结构:在设计数据库表结构时,对于频繁查询的字段可以加上索引,以提高查询速度。 7.合理使用数据库的缓存和索引:根据具体的需求,可以合理地使用数据库的缓存和索引功能,以提高查询效率。 总的来说,对于Java循环条件数据库查询优化,需要从多个方面综合考虑,结合具体的场景和需求,采取相应的措施来提高查询的效率。 ### 回答3: 在Java中,优化循环条件的数据库查询是通过以下几个步骤来实现的: 1.将频繁查询的数据缓存起来:使用缓存技术将数据库的结果存储在内存中,这样可以避免多次查询数据库。可以使用一个集合或者使用第三方的缓存工具来实现。 2.合并多个查询条件:如果查询条件中存在多个AND条件,可以考虑将这些条件合并成一个条件,这样可以减少数据库查询次数。如使用IN语句代替多个OR条件。 3.使用索引索引可以极大地提高查询速度,可以在需要经常查询的字段上创建索引。当有多个字段组合查询时,可以创建复合索引。 4.减少数据库交互的次数:可以使用批处理的方式来处理数据库操作,将多个操作合并成一个批处理操作,减少与数据库的交互次数。 5.使用分页查询:如果查询结果集很大,可以考虑使用分页的方式查询,每次只查询部分数据。这样可以减少数据库的负担和提高查询效率。 6.使用合适的数据类型:在数据库中使用合适的数据类型,可以提高查询效率。例如,如果一个字段存储的是日期类型的数据,可以使用日期类型的数据字段,而不是字符串类型。 7.优化SQL语句:通过调整SQL语句,可以提高查询效率。可以通过添加索引优化查询条件、使用合适的连接方式等方式来优化SQL语句。 8.定期清理无用数据:当数据库中存在大量无用数据时,会影响查询效率。所以定期清理无用数据,保持数据库的整洁。 总结:通过缓存、索引、合并查询条件、减少数据库交互、分页查询、使用合适的数据类型、优化SQL语句和定期清理无用数据等方法,可以有效优化循环条件的数据库查询

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值