网站首页 > 技术文章 正文
概述
关于优化这个体系博大精深,例如内核优化、系统优化、中间件优化、oracle优化、sql优化、网络优化等等,网上很多思路都比较偏,比较杂,后面小编会花比较多时间去梳理下这方面内容,深入研究下这方面,试着去做个大致优化的体系和思路。
下面主要讲索引方面的内容,基本概念就不做介绍啦。
索引原理
1. 若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有一个wish,必须全部搜索一遍
2. 若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值哪找升序排列,然后构建索引条目(name和rowid),存储到索引段中,查询name为wish时即可直接查找对应地方
3.创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描速度已经很快,没有必要使用索引
索引的类型与结构
1、索引类型
从总的概念上来说,索引分为B树索引(也叫平衡树索引,即就是什么都不写,最常用)和位图索引(多用于数据仓库)。这两种索引在逻辑结构(存储)上完全不同。
1.1、B树索引
其中B树索引 又可以具体分为:
(1)唯一索引:
唯一索引确保在定义索引的列中没有重复值,Oracle 自动在表的主键列上创建唯一索引。
使用CREATE UNIQUE INDEX语句创建唯一索引
语法:create unique index index_name on table_name (column_name);
具体列值: 索引相关列上的值必须唯一,但可以不限制NULL值。
(2)组合索引:
组合索引是在表的多个列上创建的索引,索引中列的顺序是任意的。
如果 SQL 语句的 WHERE 子句中引用了组合索引的所有列或大多数列,则可以提高检索速度
语法:create index index_name on table_name (column_name1,column_name2);
具体列值:该表中的元组由两列共同确定一行,例如班级号 学号 唯一确定一个学生。
(3)反向键索引:
反向键索引反转索引列键值的每个字节,为了实现索引的均匀分配,避免b树不平衡。
通常建立在值是连续增长的列上,使数据均匀地分布在整个索引上
创建索引时使用REVERSE关键字
语法:create index index_name on table_name (column_name) reverse;
具体列值: 适用于某列值前面相同,后几位不同的情况,例如
sno: 1001 1002 1003 1004 1005 1006 1007
索引转化:1001 2001 3001 4001 5001 6001 7001
(4)位图索引:
位图索引适合创建在低基数列上
位图索引不直接存储ROWID,而是存储字节位到ROWID的映射
节省空间占用
如果索引列被经常更新的话,不适合建立位图索引
总体来说,位图索引适合于数据仓库中,不适合OLTP中
语法:create bitmap index index_name on table_name (column_name);
具体列值: 不适用于经常更新的列,适用于条目多但取值类别少的列,例如性别列。
(5)基于函数的索引:
基于一个或多个列上的函数或表达式创建的索引,表达式中不能出现聚合函数
不能在LOB类型的列上创建
创建时必须具有 QUERY REWRITE 权限
语法:create index index_name on table_name (函数(column_name));
具体列值: 不能在LOB类型的列上创建,用户在该列上对该函数有经常性的要求。
例如:用户不知道存储时候姓名是大写还是小写,使用
select * from student where upper(sname)=’TOM’;
2、索引结构
索引的结构是一个倒立的树状结构,其中每个节点的左子树比他的右子树小,索引最终指向表里面的数据与表里面的数据对应。
如上图,前三行是索引的内部构造,第三行与最后一行,这是索引指向表里数据的一个指向。索引是建立在列上的。最后一行是索引建立在表中某列上的值。
根节点块 :如果索引列的值>0时,指向B1这个分支节点块,如果索引列的值>500时,指向B2这个分支节点块,如果索引列的值>1000时,指向B3这个分支节点块。
分支节点块:对于B1来说,再进行细分 如果索引列的值>0且<200时,指向L1这个分支节点块,如果索引列的值>200且<400时,指向L2这个分支节点块,如果索引列的值>400且<500时,指向L3这个分支节点块。
叶子节点块: 对于L1来说,如果数据行的值为0,那就放在R1这个数据行中,如果数据行的值为29,那就放在R2这个数据行中,如果数据行的值为190,那就放在R3这个数据行中,等。
SQL什么条件会使用索引?
当字段上建有索引时,通常以下情况会使用索引:
INDEX_COLUMN = ?
INDEX_COLUMN > ?
INDEX_COLUMN >= ?
INDEX_COLUMN < ?
INDEX_COLUMN <= ?
INDEX_COLUMN between ? and ?
INDEX_COLUMN in (?,?,...,?)
INDEX_COLUMN like ?||'%'(后导模糊查询)
T1. INDEX_COLUMN=T2. COLUMN1(两个表通过索引字段关联)
SQL什么条件不会使用索引?
一般在什么字段上建索引?
主键及外键通常都要有索引,其它需要建索引的字段应满足以下条件:
1、字段出现在查询条件中,并且查询条件可以使用索引;
2、语句执行频率高,一天会有几千次以上;
以下是一些字段是否需要建B-TREE索引的经验分类:
索引对DML(INSERT,UPDATE,DELETE)附加的开销有多少?
这里还没有去做实验认真测试过,主要与每个表记录的大小及索引字段大小密切相关,参考了其他人对一个普通表的测试数据:
索引对于Insert性能降低56%
索引对于Update性能降低47%
索引对于Delete性能降低29%
因此对于写IO压力比较大的系统,表的索引需要仔细评估必要性,另外索引也会占用一定的存储空间。如果不涉及增删改,可以考虑使用索引。
PS:顺便问一个问题:B+树跟B树索引有什么区别?
关于索引这块讲的还是比较浅显,后面再介绍相关的实验加深下对于索引这一块的印象,感兴趣的朋友可以关注下!
猜你喜欢
- 2024-10-15 详解Oracle 性能优化之内核的shmall、shmmax和信号灯参数
- 2024-10-15 Oracle基础知识杂谈 oracle的
- 2024-10-15 ORACLE不常用冷知识之Package oracle中package怎么执行的
- 2024-10-15 使用zabbix监控Oracle内存占用高 oracle占用内存过高
- 2024-10-15 Oracle HugePage在生产环境中的使用
- 2024-10-15 记一次Oracle异常关闭资源没有被释放,导致无法正常重启的故障
- 2024-10-15 oracle性能调优-impdp导入加速 oracle19c impdp
- 2024-10-15 oracle实例是什么 oracle实例是什么 lisener
- 2024-10-15 十个最流行的Oracle性能指标,DBA必知
- 2024-10-15 只需3分钟,学会Oracle数据库自动SGA管理
你 发表评论:
欢迎- 06-24发现一款开源宝藏级工作流低代码快速开发平台
- 06-24程序员危险了,这是一个 无代码平台+AI+code做项目的案例
- 06-24一款全新的工作流,低代码快速开发平台
- 06-24如何用好AI,改造自己的设计工作流?
- 06-24濮阳网站开发(濮阳网站建设)
- 06-24AI 如何重塑前端开发,我们该如何适应
- 06-24应届生靠这个Java简历模板拿下了5个offer
- 06-24服务端性能测试实战3-性能测试脚本开发
- 566℃Oracle分析函数之Lag和Lead()使用
- 564℃几个Oracle空值处理函数 oracle处理null值的函数
- 550℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 545℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 543℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 536℃【数据统计分析】详解Oracle分组函数之CUBE
- 526℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 518℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)