《数据库索引设计优化》读书笔记(七)
2016-02-04 16:27
411 查看
第13章 数据库索引选项
练习
13.1 调查你当前使用的DBMS版本关于索引的限制和高级选项。
.索引行压缩与异常情况
MySQL支持
Oracle支持
MySQL使用NULL值实现索引行压缩。但不推荐在实际中使用NULL来代替一个特定的值,因为从长远来看,这可能会导致应用系统错误。
![](https://img-blog.csdn.net/20160204162004365?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
表中有三个NULL值,但唯一索引创建成功。从图1可以看到,查询NULL值的记录使用了idx的索引覆盖,但type类型却是ref,表示索引的数据值是非唯一的。从Extra列的Using where可以看到需要过滤元组,可见多行NULL值被压缩成一个唯一键值。
.索引键以外的其他索引列
MySQL不支持
Oracle不支持
.唯一性约束
MySQL不支持
Oracle支持
查询结果如图2所示
![](https://img-blog.csdn.net/20160204162306759?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
查询结果如图3所示
![](https://img-blog.csdn.net/20160204162335929?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
从图2可以看到,表t1上只有一个非唯一索引idx1。从图3可以看到,表t1上有一个主键约束。索引idx1可以被用来约束主键a的唯一性。这可以通过引入primary key约束来做到。
再来看MySQL
查询结果如图4所示
![](https://img-blog.csdn.net/20160204162427398?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
MySQL在主键上新建了一个名为PRIMARY的索引,而没有使用已有的idx1索引加主键约束的方式。
.从两个方向扫描索引
MySQL支持
Oracle支持
![](https://img-blog.csdn.net/20160204162511164?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
再来看MySQL
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,都是使用的索引扫描,没有额外的排序。
![](https://img-blog.csdn.net/20160204162559981?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
.索引键截断
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)。
练习
13.1 调查你当前使用的DBMS版本关于索引的限制和高级选项。
.索引行压缩与异常情况
MySQL支持
Oracle支持
MySQL使用NULL值实现索引行压缩。但不推荐在实际中使用NULL来代替一个特定的值,因为从长远来看,这可能会导致应用系统错误。
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支持
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所示
select constraint_name,constraint_type from user_constraints;
查询结果如图3所示
从图2可以看到,表t1上只有一个非唯一索引idx1。从图3可以看到,表t1上有一个主键约束。索引idx1可以被用来约束主键a的唯一性。这可以通过引入primary key约束来做到。
再来看MySQL
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支持
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
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)。
相关文章推荐
- memcached-1.4.22介绍以及安装
- MySQL 入门 之 表 的 创建、修改与删除
- sqlite3 的约束
- #Memcached系列#(4)Windows 8.1企业版 64位操作系统安装Northscale版本的Memcached
- 简单介绍redis以及ubuntu和windows下怎么安装redis和配置文件详解
- 安装mongodb副本分片集群
- 详解 Redis 应用场景及应用实例
- 删除数据库
- SQL Select语句完整的执行顺序:
- oracle新建数据表主键实现自动递增
- oracle11G在linux环境下的卸载操作
- Memcached安装使用和源码调试
- sqlite3 limit 使用limit
- 关系数据库范式快速识别方法--第几范式
- Sql Server数据库锁相关知识
- 对数据库完成增、删、改、查询
- MySQL之——MySQL5.6 my.cnf 参数说明(附上自己服务器上真实配置文件)
- MySQL下载安装、配置与使用
- sqlite3 脚本的使用
- VS2010数据库项目不能正常工作解决方案