数据库索引
索引是什么:
索引就像是书的目录,是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。
为什么建立索引?
① 建立索引的列可以保证行的唯一性,生成唯一的rowId
② 建立索引可以有效缩短数据的检索时间
③ 建立索引可以加快表与表之间的连接
④ 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序
建立索引又有哪些缺点呢?
① 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大
② 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)
③ 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长
什么情况下需要建立索引?
①总的来说就是数据量大的,经常进行查询操作的表要建立索引
②表中字段建立索引应该遵循几个原则:
1)越小的数据类型通常更好:越小的数据类型通常在磁盘、内存中都需要更少的空间,处理起来更快。
2)简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂,处理起来也更耗时。
3)尽量避免NULL:应该指定列为NOT NULL。含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
4)对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义,所以索引的建立应当更多的选取唯一性更高的字段。
③表与表连接用于多表联合查询的约束条件的字段应当建立索引
④用于排序的字段可以添加索引,用于分组的字段应当视情况看是否需要添加索引。
⑤添加多列索引的时候,对应的多条件查询可以触发该索引的同时,索引最左侧的列的单条件查询也可以触发。
⑥如果有些表注定只会进行查询所有,也就没必要添加索引,因为查询全部只能进行全量搜索即扫描全表。
索引的类型有哪些?
oracle:
逻辑上:
Single column 单列索引:索引只有一列
Concatenated 多列索引:多列构成的索引
Unique 唯一索引:不重复的数据列才能构建唯一索引(可以为null)
NonUnique 非唯一索引:数据列可以重复
Function-based函数索引:为了避免由于在条件匹配时引入函数,导致执行计划不再使用索引,oracle提供了基于函数的索引,进而解决上述问题,提高访问效率。
Domain 域索引:建立的Oracle Text索引就是域索引
物理上:
Partitioned 分区索引
NonPartitioned 非分区索引
B-tree:
Normal 正常型B树
Rever Key 反转型B树
Bitmap 位图索引
索引的结构:
B-树:
个人公号:【排骨肉段】,可以关注一下。