索引B+Tree

外连接 彩虹的你

索引类型

 1.索引的作用是提高数据库的查询效率

  索引原理
  1. 若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有一个wish,必须全部搜索一遍

  2. 若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值升序排列,然后构建索引条目(name和rowid),存储到索引段中,查询name为wish时即可直接查找对应地方

  3.创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描速度已经很快,没有必要使用索引

 

2.如何创建索引?

  CREATE [UNIQUE] | [BITMAP] INDEX index_name --unique表示唯一索引 --bitmap,创建位图索引
  ON table_name([column1 [ASC|DESC],column2
  [ASC|DESC],…] | [express]) [TABLESPACE tablespace_name]
  [PCTFREE n1] --指定索引在数据块中空闲空间
  [STORAGE (INITIAL n2)]
  [NOLOGGING] --表示创建和重建索引时允许对表做DML操作,默认情况下不应该使用
  [NOLINE]
  [NOSORT]; --表示创建索引时不进行排序,默认不适用,如果数据已经是按照该索引顺序排列的可以使用

3.如何查看当前表是否创建索引?

 

4.索引类型(BTtree 索引 位图索引)

  1. B树索引(默认索引,保存讲过排序过的索引列和对应的rowid值)

    1)说明:

      1.oracle中最常用的索引;B树索引就是一颗二叉树;叶子节点(双向链表)包含索引列和指向表中每个匹配行的ROWID值

      2.所有叶子节点具有相同的深度,因而不管查询条件怎样,查询速度基本相同

      3.能够适应精确查询、模糊查询和比较查询

    2)分类:

       UNIQUE,NON-UNIQUE(默认),REVERSE KEY(数据列中的数据是反向存储的)

    3)创建例子

      craete index index_sno on student('sno');

    4)适合使用场景:

      列基数(列不重复值的个数)大时适合使用B数索引

  2. 位图索引

    1)说明:

      1.创建位图索引时,oracle会扫描整张表,并为索引列的每个取值建立一个位图(位图中,对表中每一行使用一位(bit,0或者1)来标识该行是否包含该位图的索引列的取值,如果为1,表示对应的rowid所在的记录包含该位图索引列值),最后通过位图索引中      的映射函数完成位到行的ROWID的转换

    2)创建例子

      create bitmap index index_sno on student(sno);
    3) 适合场景:

      对于基数小的列适合简历位图索引(例如性别等)

 

  3.单列索引和复合索引(基于多个列创建)

    1) 注意:

      即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引,即至少要包含组合索引的第一列

 

  4. 函数索引

    1)说明:

      1. 当经常要访问一些函数或者表达式时,可以将其存储在索引中,这样下次访问时,该值已经计算出来了,可以加快查询速度

      2. 函数索引既可以使用B数索引,也可以使用位图索引;当函数结果不确定时采用B树索引,结果是固定的某几个值时使用位图索引

      3. 函数索引中可以水泥用len、trim、substr、upper(每行返回独立结果),不能使用如sum、max、min、avg等

 

 

 

 

normal:表示普通索引

unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique

full textl: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。

总结,索引的类别由建立索引的字段内容特性来决定,通常normal最常见。

 

PRIMARY, INDEX, UNIQUE 这3种是一类
PRIMARY 主键。 就是 唯一 且 不能为空。
INDEX 索引,普通的
UNIQUE 唯一索引。 不允许有重复。
FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。

 

在实际操作过程中,应该选取表中哪些字段作为索引?

1.选择唯一性索引
2.为经常需要排序、分组和联合操作的字段建立索引
3.为常作为查询条件的字段建立索引
4.限制索引的数目
5.尽量使用数据量少的索引
6.尽量使用前缀来索引
7.删除不再使用或者很少使用的索引

8.函数会使索引失效

 

 

 

 

 

 

 疑问:myslq的函数 msql创建的索引类型?

    2.myql 百万级别的 sql  查询优化?

 

select count(1) from eb_order_form eb ; ---2328793

 

 

 

 

 

 

posted @ 2021-10-13 14:52  BBS_自律  阅读(27)  评论(0编辑  收藏  举报