非聚集索引和聚集索引
一.非聚集索引(MyISAM的索引方式):
使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.主键索引图:
辅助索引图:
主键索引和辅助索引没有本质上的区别,data域都保存的是数据行的地址.
二.聚集索引(InnoDB的索引方式):
InnoDB的数据文件本身就是索引文件。在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
主键索引图:
辅助索引:
InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域.
ps:
1.如果innodb表没有主键索引,innodb会自动找一个类似于此的唯一非空列,如果找不到,会增加一个隐藏列来做主索引.
2.Innodb中的每张表都会有一个聚集索引,而聚集索引又是以物理磁盘顺序来存储的,自增主键会把数据自动向后插入,避免了插入过程中的聚集索引排序问题。
其实到这儿,应该能明确一点,无论是MyISAM还是InnoDB,mysql都试图能建立起一种快速的数据查找方式.mysql利用B+Tree来解决这个问题.MyISAM只有索引文件是B+Tree方式来组织数据,数据文件并不是;所以对于MyISAM只将索引放入内存缓存;InnoDB因为数据文件本就是B+Tree方式组织,所以InnoDB是可以将索引和数据文件都放入内存;这就是为什么key_buffer_size对myisam至关重要;而innodb_buffer_size对innodb至关重要的原因.两者在解决数据快速访问的方式上是相同的.
三.覆盖索引
覆盖索引指的是数据的读取不必经过数据行,而是直接从索引中读取.对mysql,是效率最好的读取方式.
对于覆盖索引而言,myisam和innodb有截然不同的表现(非聚集索引和聚集索引)
建立表:
CREATE TABLE `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`time` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `time` (`time`)
) ENGINE=MyISAM;
插入数据:
insert into test(time) values(1);
insert into test(time) values(2);
我们来查询一条数据,看看mysql解释器表现:
mysql> explain select id from test where time=1;
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
| 1 | SIMPLE | test | ref | time | time | 5 | const | 1 | Using where |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
注意Extra列,没有出现using index;也就是没有使用覆盖索引;这很好理解,因为非聚集索引,该查询先查询了time索引(或key cache),找到对应记录的地址,然后去数据行找数据了;mysql每次查询只能用到一个索引.
如果是以下语句,就用到了覆盖索引:
mysql> explain select time from test where time=1;
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
| 1 | SIMPLE | test | ref | time | time | 5 | const | 1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
用到了time索引,只要求返回time列,不必去数据行找数据;直接从索引中找到数据返回;
现在我们将该表转为innodb,看看innodb的表现:
mysql> explain select id from test where time=1;
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
| 1 | SIMPLE | test | ref | time | time | 5 | const | 1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
用到了覆盖索引.
mysql> explain select time from test where time=1;
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
| 1 | SIMPLE | test | ref | time | time | 5 | const | 1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
转载于:https://www.cnblogs.com/itfenqing/p/8053579.html
非聚集索引和聚集索引相关推荐
- 主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等...
强烈建议看了第一个参考文献再来看这个篇博文,因为此处不准备讲底层数据结构的实现. 索引:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构.其 ...
- mysql创建非聚集索引_聚集索引和非聚集索引的区别
作者:riemann riemann.blog.csdn.net/article/details/90324846 一.深入浅出理解索引结构 实际上,可以把索引理解为一种特殊的目录.微软的SQL SE ...
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...
文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...
- [转]聚集索引和非聚集索引(sql server索引结构及其使用)
聚集索引和非聚集索引(sql server索引结构及其使用) [来自]http://www.cnblogs.com/xinqqing83/archive/2006/10/31/545747.html ...
- mysql 重复率高字段 索引,为什么重复值高的字段不能建索引(+聚集索引和非聚集索引)...
?一.原因: -?非聚簇索引存储了对主键的引用,如果?select?字段不在非聚簇索引内,就需要跳到主键索引. -?如果非聚簇索引值重复率高,那么查询时就会大量出现上图中从右边跳到左边的情况,导致整个 ...
- 唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引(NONCLUSTERED)
唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引(NONCLUSTERED) 唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引(NONCLUSTERED) 唯一 ...
- 数据库索引分类 聚集索引和非聚集索引
聚集索引:聚集索引的逻辑顺序决定了表数据行的物理存储顺序.也就是数据库中相邻的记录在物理磁盘上的地址也是相邻的.因为真实的物理存储顺序只能有一种,所以一张表只能有一个聚集索引. 主键不一定是聚集索引, ...
- 一篇读懂聚集索引、非聚集索引、覆盖索引的工作原理!
作者:PostTruth 「数据库」和「数据库索引」这两个东西是在服务器端开发领域应用最为广泛的两个概念,熟练使用数据库和数据库索引是开发人员在行业内生存的必备技能. 使用索引很简单,只要能写创建表的 ...
- 索引、顺序索引、聚集索引、非聚集索引、稠密索引、稀疏索引
两种基本索引类型: 1.顺序索引:文件记录基于某个值的顺序排序. 2.散列索引:根据散列函数和某个值,将文件记录平均分布到各个散列桶中. 1.聚合索引:数据文件记录的存储顺序,是按照某个搜索码指定的顺 ...
最新文章
- js的parseInt() map(),reduce()方法详解
- Boost:boost::bimaps::unordered_multiset_of的测试程序
- 使用Faster-Rcnn进行目标检测(实践篇)
- 【最短路】【图论】【Floyed】牛的旅行(ssl 1119/luogu 1522)
- dynamodb管理ttl_如何使用DynamoDB TTL和Lambda安排临时任务
- linux delete内存不下降_linux内存分配管理
- python月球地球质量计算_我们如何计算一个行星的质量?
- AngularJs ngList、ngRepeat、ngModelOptions
- 配置nessus服务在kali中开机自启动
- 华硕B85M-G主板安装心得
- 软件需求说明书/ 概要设计说明书/项目开发计划/详细设计说明书模版(说明要点及要点解释)
- java毕业设计茶叶销售网站Mybatis+系统+数据库+调试部署
- 英语四级词汇量测试软件,大学英语四级词汇量要求及自测卷
- pta基础编程题目集 7-1 厘米换算英尺英寸
- 微信oauth2.0授权
- java-php-python-ssm运动场所预约管理网站计算机毕业设计
- 即有分期 提前还款手续费就是不在办理的时候告诉你
- 数字逻辑设计基础(何建新)第三章
- CISSP基本概念与常见名词
- 【TextView】Android TextView显示省略号的问题(关于TextView maxLength 和maxEms的学习)