网站首页 > 技术文章 正文
sql 的优化大多数情况下是索引的优化,那么,什么情况下该创建索引,什么情况下不创建索引呢,回答这个问题之前,先来了解一下基数和选择性吧。
基数
在 Oracle 数据库中,某一列的唯一键的数量叫做基数。
举个例子,比如一张表中有个 sex 字段,它的值只有 “男” 和 “女” 两种情况,那我们就说这一列的基数是2。
我们可以通过如下语句来查询一个字段的基数。
select count(distinct deptno) as num from emp
当一个字段的基数越大的时候,该列的数据分布可能就越均衡。字段的基数越小时,该列的数据分布可能就越不均衡。
举个例子,在一个有10000行数据的表中,sex 字段基数为2,他的数据分布可能为9999行是男的,1行是女的,这是分布不均衡的现象。而在身份证字段中,它的基数是10000,每一行都是一个不同的身份证号码,这是分布均衡的现象。
我们可以通过 group by 语句来查看数据的分布情况。
select deptno,count(1) from emp group by deptno
这个时候如果我们要查询表中性别为男的数据,那么返回的数据就占了表中数据的 99.99%,其实就相当于是全表扫描,这种情况就不应该走索引了。但是如果查询表中性别为女的数据,那么返回的数据就占了表中数据的 0.01%,这个时候时候应该走索引。
一般来说,当返回表中 5% 以内的数据的时候,就应该走索引。超过 5% 的数据就要使用全表扫描。但是这个说法太绝对了,就像上面查询 sex 字段时,查询男性时候超过了 5%,查询女性时候小于 5%,那这个字段需不需要创建索引呢?
这个时候,就需要引入选择性的概念了。
选择性
基数与表的总行数的比值就是选择性。
我们可以通过以下 sql 语句来查询列的选择性。
select count(distinct deptno)/count(1) as selectivity from emp
当一个字段的选择性大于 20%,说明该列数据分布就是比较均衡的了。这个时候如果在 where 子句中使用了该字段,那么就应该创建索引。
PS:文中使用了数据量较少的表来举例子,是因为数据清晰直观,方便大家理解。而在实际情况中,只有大表才会产生性能问题。如果一个表里只有十几二十条数据,也就无所谓优化了。
猜你喜欢
- 2024-11-10 详解Oracle数据库is null和is not null在索引上的区别
- 2024-11-10 Oracle中会产生索引抑制的几种情况
- 2024-11-10 Oracle 分区表之相关陷阱 oracle分区表的缺点
- 2024-11-10 玩dotNetCore及EF6失败还是聊下Oracle索引吧
- 2024-11-10 如何“破解”Oracle数据库性能测试过程中索引使用问题?
- 2024-11-10 SQL查询慢,是因为没用对索引 sql语句查询慢 从哪些方面分析
- 2024-11-10 在Oracle中,索引有什么优点和缺点?
- 2024-11-10 Oracle 数据库索引扫描方式 oracle数据库索引查询
- 2024-11-10 Oracle 分区索引类型简述 oracle分区表索引是否失效
- 2024-11-10 Oracle 索引是一种单独的物理结构
你 发表评论:
欢迎- 09-06拆解世界顶级ERP_世界顶级古典音乐
- 09-06岂止于大,一文读懂大数据及其在推荐系统的应用
- 09-06你的生活自己掌控——《神谕女士》
- 09-06资深HR平时都读什么书?_资深的hr是怎么样的
- 09-06Oracle项目管理产品核心优势之项目全生命周期
- 09-06sql还有类型,大牛黑客必学,你也必须了解
- 09-06NoSQL 数据库的四大分类_nosql数据库的六大特性
- 09-06「干货」SQL分析函数,看这一篇就够了
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)