首页 > 其他分享 >索引组织表 Index Organizied Table 索引组织表 Index Organizied Table

索引组织表 Index Organizied Table 索引组织表 Index Organizied Table

时间:2023-05-15 20:33:31浏览次数:37  
标签:Index t1 索引 InnoDB 内存 id Table 主键 Organizied

 

CREATE TABLE t1(id INT PRIMARY KEY, c INT) ENGINE=Memory;
CREATE TABLE t2(id INT PRIMARY KEY, c INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0);
INSERT INTO t2 VALUES(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0);

 

SELECT * FROM t1;
SELECT * FROM t2;

 

InnoDB表的数据就放在主键索引树上,主键索引是B+树。所以表t2的数据组织方式如下图所示:

 

Memory引擎的数据和索引是分开的

 

表t1 的数据组织

可以看到,内存表的数据部分以数组的方式单独存放,而主键id索引里,存的是每个数据的位置。主键id是hash索引,可以看到索引上的key并不是有序的。

在内存表t1中,当我执行select *的时候,走的是全表扫描,也就是顺序扫描这个数组。因此,0就是最后一个被读到,并放入结果集的数据。

可见,InnoDB和Memory引擎的数据组织方式是不同的:

  • InnoDB引擎把数据放在主键索引上,其他索引上保存的是主键id。这种方式,我们称之为索引组织表(Index Organizied Table)。
  • 而Memory引擎采用的是把数据单独存放,索引上保存数据位置的数据组织形式,我们称之为堆组织表(Heap Organizied Table)。

从中我们可以看出,这两个引擎的一些典型不同:

  1. InnoDB表的数据总是有序存放的,而内存表的数据就是按照写入顺序存放的;

  2. 当数据文件有空洞的时候,InnoDB表在插入新数据的时候,为了保证数据有序性,只能在固定的位置写入新值,而内存表找到空位就可以插入新值;

  3. 数据位置发生变化的时候,InnoDB表只需要修改主键索引,而内存表需要修改所有索引;

  4. InnoDB表用主键索引查询时需要走一次索引查找,用普通索引查询的时候,需要走两次索引查找。而内存表没有这个区别,所有索引的“地位”都是相同的。

  5. InnoDB支持变长数据类型,不同记录的长度可能不同;内存表不支持Blob 和 Text字段,并且即使定义了varchar(N),实际也当作char(N),也就是固定长度字符串来存储,因此内存表的每行数据长度相同。

 

由于内存表的这些特性,每个数据行被删除以后,空出的这个位置都可以被接下来要插入的数据复用。比如,如果要在表t1中执行:

DELETE FROM t1 WHERE id=5;
INSERT INTO t1 VALUES(10,10);
SELECT * FROM t1;

 

 

 

 

 

 

 

翻译

搜索

复制

标签:Index,t1,索引,InnoDB,内存,id,Table,主键,Organizied
From: https://www.cnblogs.com/papering/p/17403000.html

相关文章

  • 【换模型更简单】如何用 Serverless 一键部署 Stable Diffusion?
    作者:寒斜本篇章是阿里云函数计算部署StableDiffusion系列的第三篇,如果说第一篇是尝试使用云服务来解决用户本地部署Stable Diffusion的问题(显卡成本,部署技术复杂),第二篇是面向技术同学解决云服务Stable Diffusion的实用性问题(自定义模型,扩展),那么本篇则是以更大众的方式实现......
  • element-ui的el-table自带横线的去除 和 table边框线去除
    去除table单元格的底线和去除table的边框线//去掉所有的横线.el-table__row>td{border:none;}.el-table::before{height:0px;}//只去除表格的最最底部的横线div/deep/.el-table--border::after,div/deep/.el-table--group::after,div/deep/.el-table::b......
  • Linux下基于iptables的hashlimit模块限速
    记录一下:【对目标IP限制下载速率】出站包,目标IP为x.x.x.x,限速200KBytes/s:iptables-AOUTPUT-dx.x.x.x-mhashlimit--hashlimit-above200kb/s--hashlimit-modedstip--hashlimit-nameout-jDROP 【对自身tcp/12345提供的服务限制下载速率】出站包,源端口是tcp/12......
  • git commit错误 error: bad signature 0x00000000 fatal: index file corrupt
    gitcommit错误error:badsignature0x00000000fatal:indexfilecorrupt 这个错误信息表明您的git仓库中的索引文件已损坏。修复此问题的一种方法是删除索引文件并重置它。您可以在仓库的根目录中运行以下命令:rm-f.git/indexgitreset这将删除索引文件并将其还原......
  • Table被web编程弃用的原因
    Table要比其它html标记占更多的字节。(延迟下载时间,占用服务器更多的流量资源。)Tablle会阻挡浏览器渲染引擎的渲染顺序。(会延迟页面的生成速度,让用户等待更久的时间。)Table里显示图片时需要你把单个、有逻辑性的图片切成多个图。(增加设计的复杂度,增加页面加载时间,增加HTTP会话......
  • SQLiteTableTool
    //提供了一些关于表操作的快捷方法(不是必要组件),当然,SQLiteStudio之类的强大且专业的工具软件也是不可或缺的//使用提示:通过在一个脚本的字段上添加[SerializeToTableCol]特性可以直接读取到TableTool的列表里,然后可以根据这个列表创建表(当然也可以手动填写这个表再创建)using......
  • Python for loop with index All In One
    PythonforloopwithindexAllInOne带索引的Pythonfor循环error❌#!/usr/bin/python3Blue=17GREEN=27RED=22LEDs=list([RED,GREEN,Blue])forled,iinLEDs:print('led=',LEDs[i])#22,27,17"""Traceback(mo......
  • Salesforce LWC学习(四十四) Datatable 显示日期类型的有趣点思考
    本篇参考:https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_salesforce_modules背景:项目中经常用到datatable显示日期类型字段,并要求日期类型字段基于指定格式显示。这种是一个很常见的需求,而且demo很容易找到,无论是官方文档中还是......
  • 解决docker search influxdb 报错Error response from daemon: Get "https://index.do
    解决dockersearchinfluxdb报错Errorresponsefromdaemon:Get"https://index.docker.io/v1/search?q=influxdb&n=25":dialtcp:lookupindex.docker.ioon192.168.12.2:53:readudp192.168.12.128:39189->192.168.12.2:53:i/otimeoutdockerpull&......
  • Ubuntu系统下python模块graphviz运行报错:graphviz.backend.execute.ExecutableNotFoun
    代码中需要运行python模块graphviz,安装:pipinstallgraphviz 运行后报错:graphviz.backend.execute.ExecutableNotFound:failedtoexecutePosixPath('dot'),makesuretheGraphvizexecutablesareonyoursystems'PATH  报错的全部信息:Traceback(mostrecentc......