前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《数据库索引设计优化》读书笔记(七)

《数据库索引设计优化》读书笔记(七)

作者头像
用户1148526
发布2022-05-07 12:41:25
1750
发布2022-05-07 12:41:25
举报
文章被收录于专栏:Hadoop数据仓库Hadoop数据仓库

第13章 数据库索引选项 练习 13.1 调查你当前使用的DBMS版本关于索引的限制和高级选项。 .索引行压缩与异常情况 MySQL支持 Oracle支持 MySQL使用NULL值实现索引行压缩。但不推荐在实际中使用NULL来代替一个特定的值,因为从长远来看,这可能会导致应用系统错误。

代码语言:javascript
复制
create table t1 (a int);
insert into t1 values (1),(2),(3),(null),(4),(null),(5),(null);
commit;
select count(*) from t1;
create unique index idx1 on t1(a);

explain select * from t1 where a=1;
explain select * from t1 where a is null;

表中有三个NULL值,但唯一索引创建成功。从图1可以看到,查询NULL值的记录使用了idx的索引覆盖,但type类型却是ref,表示索引的数据值是非唯一的。从Extra列的Using where可以看到需要过滤元组,可见多行NULL值被压缩成一个唯一键值。 .索引键以外的其他索引列 MySQL不支持 Oracle不支持 .唯一性约束 MySQL不支持 Oracle支持

代码语言:javascript
复制
create table t1(a int,b varchar2(20));
create index idx1 on t1(a,b);
alter table t1 add primary key (a);
select index_name,uniqueness from user_indexes;

查询结果如图2所示

代码语言:javascript
复制
select constraint_name,constraint_type from user_constraints;

查询结果如图3所示

从图2可以看到,表t1上只有一个非唯一索引idx1。从图3可以看到,表t1上有一个主键约束。索引idx1可以被用来约束主键a的唯一性。这可以通过引入primary key约束来做到。 再来看MySQL

代码语言:javascript
复制
create table t1(a int,b varchar(20));
create index idx1 on t1(a,b);
alter table t1 add primary key (a);
show index from t1;

查询结果如图4所示

MySQL在主键上新建了一个名为PRIMARY的索引,而没有使用已有的idx1索引加主键约束的方式。 .从两个方向扫描索引 MySQL支持 Oracle支持

代码语言:javascript
复制
create table t1 as select * from dba_objects;
create index idx1 on t1(owner,object_id);
exec dbms_stats.gather_table_stats(ownname=>'WXY',tabname => 'T1',estimate_percent=> 20 , cascade=> TRUE );
set autotrace traceonly;
select * from t1 where owner='SYS' and object_id > 50000 order by object_id desc;

查询结果如图5所示,进行了索引范围逆向扫描。

再来看MySQL

代码语言:javascript
复制
create table t1 as select * from information_schema.tables;
create index idx1 on t1(table_schema,table_name);
explain select * from t1 where table_schema='test' order by table_name desc;
explain select * from t1 where table_schema='test' order by table_name;

查询结果如图6所示,无论是正向还是反向order by,都是使用的索引扫描,没有额外的排序。

.索引键截断 MySQL不支持 Oracle不支持 .基于函数的索引 MySQL不支持 Oracle支持 .索引跳跃式扫描 MySQL支持(Loose Index Scan)一个例子 http://explainextended.com/2010/05/08/max-and-min-on-a-composite-index/ Oracle支持(INDEX SKIP SCAN) .块索引 MySQL不支持 Oracle支持(cluster index) .数据分区的二级索引 MySQL分区表只支持本地索引。 Oracle分区表支持本地索引(Local)和全局索引(Global)。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档