查询除了一列意外_想让你的查询语句变快吗?
蒋蒋~大家吼啊 相信大家都遇到过查询语句龟速的情况,那心情,那酸爽
大家别怕,我们有索引这个东西
索引:索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
而索引也有很多种类的
索引分类
逻辑:单行索引、多行索引、唯一索引、非唯一索引、函数索引
物理:分区索引、非分区索引、B-tree索引、bitmap索引
B-tree索引
它的存储结构类似于书的目录索引结构,有分支节点和叶子节点,分支节点相当于书的大目录,叶子节点相当于具体到页的索引。
优点:适合高基数的列(唯一值多),适合与大量的增、删、改(OLTP)。
缺点:不适合键值重复率较高的字段上使用。
Bitmap索引
是由一串位所组成的。如果某一位置位(为1),就表示该位所对应的行包含索引的键值。如果该位没有被置位(为0),就表示该位所对应的行不包含索引的键值。
优点:OLAP 例如报表类数据库 重复率高的数据 特定类型的查询例如count、or、and等逻辑操作因为只需要进行位运算即可得到我们需要的结果。
缺点:不适合重复率低的字段,还有经常DML操作(insert,update,delete),因为位图索引的锁代价极高,修改一个位图索引段影响整个位图段,所以对于OLTP 系统位图索引基本上是不适用的。
索引扫描的种类
根据索引的类型与where限制条件的不同分类
(1) 索引唯一扫描(index unique scan)通过unique或primary key约束来保证只返回一条数据,那么优化器就会选择索引唯一扫描。
(2) 索引范围扫描(index range scan)使用一个索引存取多行数据或者索引键非唯一,即使返一行记录也走范围扫描。
(3) 索引跳跃扫描(index skip scan)当表有一个复合索引,而在查询中有除了索引中第一列的其他列作为条件,这时候查询计划就有可能使用到。
(3) 索引全扫描(index full scan)和索引快速扫描(index fast full scan)如果想搜索的列都包含在索引里面,那么index full scan 和 index fast full scan 都可以被采用代替full table scan。
index full scan首先要找到索引的根,然后通过枝节点找到第一个叶节点,然后再顺着叶节点链扫描整个索引,只能使用单块读,会发现大量的db file sequential read等待。
index fast full scan对索引的扫描可以根据该索引的extent来进行,采用多块读的方式进行。因此在这类操作中,我们可以看到会话会大量的出现db file scattered read等待。
索引的适用场合
B*Tree索引
常规索引,多用于oltp系统,快速定位行,应建立于存在很少相同值的列。
反向索引
B*Tree的衍生产物,应用于特殊场合,在并发环境序列增加的列上建立,不适合做范围扫描。
降序索引
B*Tree的衍生产物,应用于有降序排列的搜索语句中,索引中储存了降序排列的索引码,提供了快速的降序搜索。
函数索引
B*Tree的衍生产物,应用于查询语句条件列上包含函数的情况,索引中储存了经过函数计算的索引码值。可以在不修改应用程序的基础上能提高查询效率。
位图索引
位图方式管理的索引,适用于OLAP(在线分析)和DSS(决策处理)系统,适合集中读取,不适合插入和修改,提供比B*Tree索引更节省的空间。
常见几种不走索引的场景
(1)隐式类型转换
(2)索引失效
(3)like '%***'
(4)is null 或者is not null
(5)使用<> 或者!=
(6)在索引列上使用函数
(7)在索引列上运算
点点关注不迷路~点点转发真威武~每日更新最新动态~谢谢各位老爷ヾ(✿゚▽゚)
总结
以上是生活随笔为你收集整理的查询除了一列意外_想让你的查询语句变快吗?的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: api php usdt 以太坊_以太坊
- 下一篇: 新建文件注释_PDF汇总注释原来如此简单