提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本博客为SQL优化核心思想学习笔记
提示:以下是本篇文章正文内容,下面案例可供参考
一、基数
某个列唯一键的数量叫做基数。比如性别列,该列只有男女之分。所以基数是2,主键列的基数等于表的总行数。基数高低影响列的数据分布。
grant dba to scott;
conn scott/tiger
create table test as select * from dba_objects;
SCOTT@PROD> select count(distinct owner),count(distinct object_id),count(*) from test;
COUNT(DISTINCTOWNER) COUNT(DISTINCTOBJECT_ID) COUNT(*)
-------------------- ------------------------ ----------
29 86970 86970
TEST表86970行,owner列的基数为29,说明该列有大量重复值。OBJECT_ID列的基数等于总行数,说明OBJECT_ID没有重复值,相当于主键。。owner列的数据分布如下
select owner,count(*) from test group by owner order by 2 desc;
owner的数据分布极不均衡,我们运行如下SQL
select * from test where owner = 'SYS''
SYS列有37786条数据,也就是要返回表43.4%的数据
SCOTT@PROD> select 37786/86970*100 from dual;
37786/86970*100
---------------
43.4471657
那么请你思考,你认为这样的查询应该走索引吗?
select * from test where owner = 'SCOTT'
select 7/86970*100 Percent from dual;
scott有7条数据,从86970多的表中取7条数据,相当于要返回表中0.009%的数据,那么请思考,返回表中0.08%的数据不应该走索引吗?
总结
如果你现在还不懂索引,那么请记住,当查询结果在5%以内的数据时,应该走索引,但查询结果超过表5%的数据时,应该走全表扫描。
为什么会有这样的结论,请看下面章节进行概述