我们知道一般的表都以堆(heap)的形式来组织的,这是无序的组织方式。

    Oracle还提供了一种有序的表,它就是索引组织表,简称IOT表。IOT表上必须要有主键,而IOT表本身不对应segment,表里所有的数据都存放在主键所在的索引的叶子节点里。

    换句话说,在索引叶子节点里的索引条目里不仅存放了被索引的列的值,还同时存放了其他列的值。

    对于总是通过主键访问数据的表来说,比较适合使用IOT表。如果使用普通表,则通过主键索引访问表时,至少要读取两个数据块:一个索引块,另一个是表的数据块。

    而如果通过IOT表,由于表的数据就存放在索引块中,所以只需要读取一个块即可。IOT表时虚拟表,但是他具有普通表所有的特性。

    而且尽管IOT表的数据实际存放在索引segment里,但是我们还是可以在IOT表的基础上,在其他列上再次创建索引,这种索引我们叫二级索引。

使用二级索引查找数据时,存在以下两个阶段:
1,物理猜测:根据二级索引里记录的物理ROWID,去扫描其指向的IOT表所依附的索引segment里的索引节点。
2,逻辑猜测:由于IOT表的数据存放在索引的叶子节点里,而由于在索引里数据都是有序存放的,数据会子会在叶子节点中间插入,因此就存在向叶子节点的拆分问题。一旦叶子节点被拆分,数据所在的索引块就会变化,那么二级索引所指向的位置也就错误了。通过物理ROWID去访问IOT表就找不到数据。这个时候,Oracle会进行逻辑猜测,这时就不使用ROWID了,而是使用主键列的值去扫描IOT表。 创建IOT表的例子如下:
create table iot_test(id number,c1 varchar2(40),c2 varchar2(40),c3 varchar2(40),c4 varchar2(40),primary key(id)) organization index SQL> select object_name,object_type from user_objects; OBJECT_NAME OBJECT_TYPE
-------------------- -------------------
SYS_IOT_TOP_96480 INDEX
IOT_TEST TABLE 我们定义的IOT表时,必须创建一个主键约束,然后指定organization index选项,可以同时指定主键对应的索引所在的表空间名称。 从上面的例子中,假设经常访问的列id和c1这两个列,则如果把其他的c2,c3,c4列也放在索引块里,会比较浪费空间。因为这三列并不经常被访问,没有必要把他们与id,c1放在一起。于是我么就可以通过设置pctthreshold和including这两个属性,从而只在索引块里存放id和c1,而且他的三列在放入overflow里,(overflow是一种segment). pctthreshold说明留在索引块里的数据空间占总数据块大小的百分比,从0到50%。假设在IOT_TEST表中,id列和c1列总共大概需要400个字节,索引块大小为8kB,我们希望ID列和C1列留在索引块里。则留在索引块里的数据占整个索引块大小的5%(500/8192),于是可以将pctthreshold设置为5.我们还可以使用including,对于上面的例子来说,including c2表示从C2列开始,后面所有的列(也就是C2,C3,C4这三列)都放到overflow里。优先考虑pctthreshold,也就是说如果id列的值占数据块大小的百分比已经超过了指定的pctthreshold,则尽管指定的是从C2列开始后面的所有列都放入OVERFLOW,但是由于违反了pctthreshold,则C1以后的列也都全部放入overflow里(即c1,c2,c3,c4都放入overflow里) Mysql IOT表: IOT表 (sn,a1,a2,a3) SN上有主键 这个主键存放了sn,a1,a2,a3的数据 那么我在a1上在创建索引test_idx1 那么test_idx1包含哪些数据 a1,sn这样排列的应该
通过sn来回表

Mysql iot表的更多相关文章

  1. Mysql InnoDB 是IOT表 锁基于索引

    </pre>Mysql InnoDB 是IOT表 锁基于索引<pre>

  2. mysql向表中某字段后追加一段字符串:

    mysql向表中某字段后追加一段字符串:update table_name set field=CONCAT(field,'',str) mysql 向表中某字段前加字符串update table_n ...

  3. oracle与mysql创建表时的区别

    oracle创建表时,不支持在建表时同时增加字段注释.故采用以下方式: #创建表CREATE TABLE predict_data as ( id integer ), mid ), time dat ...

  4. mysql数据库表的自增主键号不规律,重新排列

    mysql数据库表的自增主键ID乱了,需要重新排序. 原理:删除原有的自增ID,重新建立新的自增ID. 1.删除原有主键: ALTER TABLE `table_name` DROP `id`; 2. ...

  5. 基于表的数据字典构造MySQL建表语句

    表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...

  6. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  7. 用户中心mysql数据库表结构的脚本

    /* Navicat MySQL Data Transfer Source Server : rm-m5e3xn7k26i026e75o.mysql.rds.aliyuncs.com Source S ...

  8. MySQL InnoDB表--BTree基本数据结构

    MySQL InnoDB表是索引组织表这一点应该是每一个学习MySQL的人都会首先学到的知识,这代表这表中的数据是按照主键顺序存储,也就是说BTree的叶子节点存储了所有该行的数据. 我最开始是搞Or ...

  9. mysql数据库表结构导出

    mysql数据库表结构导出 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; 导出整个数据库结构和数据 mysqldump -h localh ...

随机推荐

  1. 小记:css特殊性

    今天早上遇到了个小bug,刚好用从css权威指南学到的知识解决了 html结构 <ul class="portlet-nav"> <li><a id= ...

  2. docker学习笔记2:容器操作

    一.列出主机上已经创建的容器 docker ps -a 二.创建交互式容器 命令: docker run -i -t ubuntu /bin/bash 其中-i -t 表示创建一个提供交互式shell ...

  3. Offer_1

    #include <iostream> #include <cstring> using namespace std; class CMyString { public: CM ...

  4. android模拟器 一个错误:X Error of failed request: BadRequest (invalid request code or no such operation)

    最近ubuntu12.04学习python,python2.7 python3.2所不同的是还是蛮大的.学习思考的新 升级后 结果显示 输入方法不显示   update-manager 和  add- ...

  5. 拥抱AngularJS

    文中一些地方AngularJS简称ng 简介: ng诞生于2009年,由Misko Hevery等创建,后被Google收购,为克服HTML在构建应用上的不足而设计. 是一款优秀的前端JS框架,核心特 ...

  6. Qt Creator键盘快捷键速查

    原地址:http://bbs.qter.org/forum.php?mod=viewthread&tid=904&extra=page%3D2 一般操作的键盘快捷键 操作 快捷键 操作 ...

  7. php使用 _before_index() 来实现访问页面前,判断登录

    C:\wamp\www\DEVOPS\Home\Lib\Action: <?php class IndexAction extends Action { function index(){ $t ...

  8. Kendo UI开发教程(24): 单页面应用(二) Router 类

    Route类负责跟踪应用的当前状态和支持在应用的不同状态之间切换.Route通过Url的片段功能(#url)和流量器的浏览历史功能融合在一起.从而可以支持把应用的某个状态作为书签添加到浏览器中.Rou ...

  9. servlet后台怎样接收对象參数

    主要思想是用js把对象转换成json.然后把json提交到后台去,后台把这个json字符串转换成map对象 <script type="text/javascript"> ...

  10. Effective C++_笔记_条款02_尽量以const、enum、inline替换#define

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许#d ...