SQL数据库之索引优缺点

article/2025/9/7 6:38:43

 

SQL数据库之索引使用原则及利弊

 

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

 

优点

  1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 
  2. 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 
  3. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 
  4. 在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 
  5. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

PS:正确的索引会大大提高数据查询、对结果排序、分组的操作效率。

 

缺点

  1. 存储空间,每个索引都要空间存储
  2. 如果非聚集索引很多,一旦聚集索引改变,那么所有非聚集索引都会跟着变。
  3. 过多索引会导致优化器优化过程需要评估的组合增多。
  4. 每个索引都有统计信息,索引越多统计信息越多。
  5. 更新开销,一旦一个数据改变,并且改变的列比较多,可能会引起好几个索引跟着改变。

PS:创建索引和维护索引要耗费时间,这种时间消耗会随着数据量的增加而增加;索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

 

分类

聚集索引>>

聚集索引基于数据行的键值,在表内排序和存储这些数据行。每个表只能有一个聚集索引,应为数据行本分只能按一个顺序存储。在聚集索引中,表中各行的物理顺序与索引键值的逻辑(索引)顺序相同。聚集索引通常可加快UPDATE和DELETE操作的速度,因为这两个操作需要读取大量的数据。创建或修改聚集索引可能要花很长时间,因为执行这两个操作时要在磁盘上对表的行进行重组。

 

非聚集索引>>

因为一个表中只能有一个聚集索引,如果需要在表中建立多个索引,则可以创建为非聚集索引。表中的数据并不按照非聚集索引列的顺序存储,但非聚集索引的索引行中保存了非聚集键值和行定位器,可以快捷地根据非聚集键的值来定位记录的存储位置。非聚集索引,本质上来说也是聚集索引的一种.非聚集索引并不改变其所在表的物理结构,而是额外生成一个聚集索引的B树结构,但叶子节点是对于其所在表的引用,这个引用分为两种,如果其所在表上没有聚集索引,则引用行号。如果其所在表上已经有了聚集索引,则引用聚集索引的页。

 

使用原则

  1. 不要索引数据量不大的表,对于小表来讲,表扫描的成本并不高。
  2. 不要设置过多的索引,在没有聚集索引的表中,最大可以设置249个非聚集索引,过多的索引首先会带来更大的磁盘空间,而且在数据发生修改时,对索引的维护是特别消耗性能的。
  3. 合理应用复合索引,有某些情况下可以考虑创建包含所有输出列的覆盖索引。
  4. 对经常使用范围查询的字段,可能考虑聚集索引。
  5. 避免对不常用的列,逻辑性列,大字段列创建索引。

 

创建索引

  1. 在经常需要搜索的列上,可以加快搜索的速度; 
  2. 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 
  3. 在经常用在连接的列上,这 些列主要是一些外键,可以加快连接的速度; 
  4. 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 
  5. 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 
  6. 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
     

避免索引

  1. 对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 
  2. 对于那 些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引并不能明显加快检索速度。 
  3. 对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 
  4. 当修改性能远远大于检索性能时,不应该创建索引。这是因为修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

 

索引算法

BTree索引

  • BTree(多路搜索树,并不是二叉的)是一种常见的数据结构。使用BTree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。按照翻译,B 通常认为是Balance的简称。这个数据结构一般用于数据库的索引,综合效率较高。逻辑结构为一颗N叉平衡树,每列中distinct  key 都对应一个 RIDs(Row IDentifiers)数组。树状结构适合频繁的更新操作,适用于事物型数据库。

  不适合场景

  • 单列索引的列不能包含null的记录,复合索引的各个列不能包含同时为null的记录,否则会全表扫描;
  • 不适合键值较少的列(重复数据较多的列),即低基数情况,索引结构空间冗余,B-Tree树上会存在大量相同键值的叶子节点,造成严重的空间和I/O扫描浪费;
  • N叉平衡树的结构会随着记录的增多而膨胀。
  • 单一索引路径选择问题,即SQL条件中包含多列时,即时每个列对应一个索引,在执行中也只能沿着一个索引的执行路径, 而其它列之能作为筛选条件。
  • 前导模糊查询不能利用索引(like '%XX'或者like '%XX%')
     

Hash散列索引

  • Hash散列索引是根据HASH算法来构建的索引。虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。精确查找非常快(包括= <> 和in),其检索效率非常高,索引的检索可以一次定位,不像BTree 索引需要从根节点到枝节点,所以 Hash 索引的查询效率要远高于 B-Tree 索引。

  不适合场景

  • 不适合模糊查询和范围查询(包括like,>,<,between……and等),由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样;
  • 不适合排序,数据库无法利用索引的数据来提升排序性能,同样是因为Hash值的大小不确定;
  • 复合索引不能利用部分索引字段查询,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
  • 同样不适合键值较少的列(重复值较多的列);
     

Bitmap位图索引

 就是用位图表示的索引,对列的每个键值建立一个位图,即每列中的distinct key都对应一bit序列。相对于BTree索引,占用的空间非常小,创建和使用非常快。位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少。下图是位图索引的一个直观描述。其中,Identifier列是每一行的唯一标识,HasInternet是索引列,那么右侧的Bitmaps下方的两列Y和N则表示左侧所对应的bitmap索引。 

 

  • 适合决策支持系统,数据仓库,OLAP类分析场景,图数据库;
  • 当select count(XX) 时,可以直接访问索引中一个位图就快速得出统计数据;
  • 当根据键值做and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,快速得出结果行数据。
  • 利用计算机硬件对按位操作(AND/OR/XOR)的强有力的支持,从而使单列内部的按位操作可以有效的转化为按位逻辑操作。
  • 多列之间的结果聚合也可以有效的转化为按位逻辑操作。
  • 适合只读,较少更新或者追加的数据集上的查询操作。

 不适合的场景

  • 不适合键值较多的列(重复值较少的列);
  • 不适合update、insert、delete频繁的列,代价很高。
  • 更新操作慢,由于更新操作的锁只能有单用户获取,并且需要同时锁住很多索引,故并发性能较差。
     

转载来源:https://www.cnblogs.com/zuowj/p/3520509.html

参考来源:https://blog.csdn.net/u010265638/article/details/71191116 

参考来源:https://blog.csdn.net/sanyaoxu_2/article/details/79026050 


http://chatgpt.dhexx.cn/article/HuB5q7DO.shtml

相关文章

Oracle索引的建立及优缺点

在看公司建表语句时发现了这样一段代码 本着学习的态度面向百度&#xff1a;&#xff1a;&#xff1a;&#xff1a;&#xff1a; 原来这是Oracle的索引 Oracle的索引说明 1&#xff09;索引是数据库对象之一&#xff0c;用于加快数据的检索&#xff0c;类似于书籍的索引。在…

MySQL索引的优缺点

MySQL 中的索引简介 1、索引的优点 为什么要创建索引&#xff1f;这是因为&#xff0c;创建索引可以大大提高系统的查询性能。 第一、通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。 第二、可以大大加快数据的检索速度&#xff0c;这也是创建索引的最…

MySQL索引的使用知识有哪些?

面试造火箭&#xff0c;工作拧螺丝&#xff0c;虽然工作时我们都在使用基本的 sql&#xff0c;但是不好意思&#xff0c;面试 90% 都在问原理&#xff0c;例如索引&#xff0c;锁&#xff0c;日志&#xff0c;引擎啊等等。 在关系数据库中&#xff0c;索引是一种单独的、物理的…

索引的数据结构与优缺点

1、索引的数据结构 什么是索引&#xff1f; 索引就是mysql为了提高查询数据的一种数据结构。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法 的数据结构&#xff0c;这些数据结构以某种方式引用(指向)数据&#xff0c;这样就可以在这些数据结构上实现高级查找 算法…

Oracle 数据库:ORA-12541: TNS: 无监听程序 的解决办法

路径下D:\app\ou\product\11.2.0\dbhome_1\NETWORK\ADMIN host后面地址全改为 " HOSTlocalhost " 。 以上两个配置文件修改完成后&#xff0c;Win R 在弹出框中输入 " SERVICES.MSC " &#xff0c;找到Oracle的服务&#xff08;OracleService&#xff09;…

ora12541+tns-01153未能处理字符串

操作系统&#xff1a; windows2008 数据库&#xff1a;oracle11g 数据库运行中突然连接不上 ora12541TNS:无监听程序 数据库服务器端查看&#xff1a; 使用dos端sqlplus登录正常 重启Oracle服务依然无法登陆 ora12541TNS plsql无法连接 使用 lsnrctl status 查看监听状态…

plsql远程访问数据库 解决 ora12170TNS 连接超时,ora-12541:TNS:无监听程序

自己在虚机linux安装了o12版本后&#xff0c;计划通过wins主机通过plsql操作oracle&#xff0c; 结果没有顺利链接&#xff0c;plsql报错 排错步骤: 1.查看网络是否通畅 打开cmd, ping 数据库IP 2. 查看端口是否通畅 打开cmd,tnsping 数据库IP 如果piing不通,可能是防火墙问…

ora-12541

描述&#xff1a;oracle 19c plsql登录报错 原因&#xff1a;修改了服务器的名称为ods 解决&#xff1a;修改listener.ora&#xff0c;tnsnames.ora文件中服务器名为ods&#xff0c;重启监听即可

oracle数据库只能用127.0.0.1和localhost登录,用ip无法登陆,提示ora12541监听错误解决办法

这些修改都在oracle安装完成后的服务端文件中修改&#xff0c;客户端里面的监听文件默认是没有的&#xff0c;也不需要配置 oracle服务端&#xff0c;客户端安装完成后&#xff0c; 服务端监听文件 E:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.or…

Oracle ORA12514 监听程序当前无法识别连接描述符中请求的服务

最简单的有可能是你的服务还没有开启&#xff0c;需要启动服务&#xff01;&#xff01;&#xff01;&#xff01; 在连接数据库的时候&#xff0c;有时会遇到一个“ORA12514&#xff1a;监听程序当前无法识别连接描述符中请求的服务”的错误&#xff0c;这个错误其实就是数据…

使用Navicat连接Oracle数据库及ORA-12541: TNS: 无监听程序、ORA-28547:connection to server failed、ORA-12514:TNS报错解决方案

1、Navicat的安装请参考:图形化界面之Navicat Premium 12 的安装与使用_蓝多多的小仓库的博客-CSDN博客_navicat premium12使用 2、打开Navicat,选择连接--->Oracle 3、配置常规和高级选项 这里服务名请参考: 为了避免后续存在权限问题,这里角色选择SYSDBA: 4、各项…

oracle报错ORA-12514

问题&#xff1a;oracle使用服务名orcl登录不成功&#xff0c;并且报错 ORA-12514, TNS:listener does not currently know of service requested in conn原因分析&#xff1a; ORA-12514 错误通常表示 Oracle 数据库监听器无法识别客户端请求的服务名称。这可能是由于以下原因…

Oracle ORA-12541的处理

Oracle ORA-12541的处理 Lsnrctl status Lsnrctl start 尝试链接进去sqlplus xxx/xxx198.126.12.3/fpd ps -ef | grep pmon 确定实例没有打开 查看数据库日志的停库原因 发现数据库日志是被截断的&#xff0c;数据库日志被截断一般是系统冗机的问题 那就直接startup开库 因…

连接linux数据库Oracle时报错ORA-12541: TNS: 无监听程序重启后提示出现ORA-01034和ORA-27101

1 windows上安装Oracle的客户端。 2 确保linux服务器上的1521端口开放 3 看你的window机器是够能够ping同linux服务器的ip地址 4 在windows中的Oracle客户端的tnsnames.ora里添加你要连接的Oracle&#xff08;即虚拟里Linux的Oracle&#xff09;信息。 5 虚拟机linux打开Or…

ORA-12541:TNS:无监听程序

最近很郁闷&#xff0c;本人电脑上安装了oracle11g,每次关机再开机后登录PL/SQL DEVELOPER都提示ora-12541无监听程序&#xff0c;网上找了半天&#xff0c;重新配置listener.ora,tnsnames.ora,可是还是不行&#xff0c;通过在dos命令窗口重启监听就好了&#xff0c;有没有网友…

ORA-12541:TNS:no listener

PLSQL作为一个专门开发面向Oracle数据库的应用&#xff0c;那登录时肯定和Oracle息息相关了。那面对出现“ORA-12541:TNS:no listener”时应该怎么办呢&#xff1f;我分为了三个步骤&#xff1a;“确保Oracle连接成功”和“Oracle的Net Configuration Assistant的配置”和“重新…

ORA-12541: TNS: 无监听程序 的解决办法

今天好好的&#xff0c;突然有用户报系统登录不了了&#xff0c;经过排查问题出在Oracle&#xff0c;报ORA-12541: TNS: 无监听程序&#xff0c;先是重新服务不行&#xff0c;然后重新配置监听还不行&#xff0c;最后上网查了一下&#xff0c;结果是是它的问题哈&#xff0c;就…

关于连接Oracle数据库时出现的“ORA-12541:TNS 无监听程序”和“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”的解决办法

目录 问题一&#xff1a;“ORA-12541&#xff1a;TNS 无监听程序”。 问题2&#xff1a;“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务” 问题一&#xff1a;“ORA-12541&#xff1a;TNS 无监听程序”。 ① 关闭所有Oracle服务 winr&#xff1a;输入SERVICES.MS…

ORA-12541 无监听程序解决方案

1、先进入服务看OracleOraDb11g_home1TNSListener和OracleServiceORCL是否打开&#xff0c;如果没打开就将他们打开&#xff0c;如果打开了再连接还是出现 “ORA-12541 无监听程序解决方案”&#xff0c;那么请查看2 2、如果OracleOraDb11g_home1TNSListener和OracleServiceORC…

ORA-12541错误总结

这个错误很普遍&#xff0c;也很容易遇到。今天刚在电脑上装了个oracle&#xff0c;连接时就出现了这个问题 1、 ORA-12541: TNS: 没有监听器 显而易见&#xff0c;服务器端的监听器没有启动&#xff0c;另外检查客户端IP地址或端口填写是否正确。 启动监听器&#xff1a; …