一.非聚集索引(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

非聚集索引和聚集索引相关推荐

  1. 主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等...

    强烈建议看了第一个参考文献再来看这个篇博文,因为此处不准备讲底层数据结构的实现. 索引:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构.其 ...

  2. mysql创建非聚集索引_聚集索引和非聚集索引的区别

    作者:riemann riemann.blog.csdn.net/article/details/90324846 一.深入浅出理解索引结构 实际上,可以把索引理解为一种特殊的目录.微软的SQL SE ...

  3. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  4. [转]聚集索引和非聚集索引(sql server索引结构及其使用)

    聚集索引和非聚集索引(sql server索引结构及其使用) [来自]http://www.cnblogs.com/xinqqing83/archive/2006/10/31/545747.html ...

  5. mysql 重复率高字段 索引,为什么重复值高的字段不能建索引(+聚集索引和非聚集索引)...

    ?一.原因: -?非聚簇索引存储了对主键的引用,如果?select?字段不在非聚簇索引内,就需要跳到主键索引. -?如果非聚簇索引值重复率高,那么查询时就会大量出现上图中从右边跳到左边的情况,导致整个 ...

  6. 唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引(NONCLUSTERED)

    唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引(NONCLUSTERED) 唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引(NONCLUSTERED) 唯一 ...

  7. 数据库索引分类 聚集索引和非聚集索引

    聚集索引:聚集索引的逻辑顺序决定了表数据行的物理存储顺序.也就是数据库中相邻的记录在物理磁盘上的地址也是相邻的.因为真实的物理存储顺序只能有一种,所以一张表只能有一个聚集索引. 主键不一定是聚集索引, ...

  8. 一篇读懂聚集索引、非聚集索引、覆盖索引的工作原理!

    作者:PostTruth 「数据库」和「数据库索引」这两个东西是在服务器端开发领域应用最为广泛的两个概念,熟练使用数据库和数据库索引是开发人员在行业内生存的必备技能. 使用索引很简单,只要能写创建表的 ...

  9. 索引、顺序索引、聚集索引、非聚集索引、稠密索引、稀疏索引

    两种基本索引类型: 1.顺序索引:文件记录基于某个值的顺序排序. 2.散列索引:根据散列函数和某个值,将文件记录平均分布到各个散列桶中. 1.聚合索引:数据文件记录的存储顺序,是按照某个搜索码指定的顺 ...

最新文章

  1. js的parseInt() map(),reduce()方法详解
  2. Boost:boost::bimaps::unordered_multiset_of的测试程序
  3. 使用Faster-Rcnn进行目标检测(实践篇)
  4. 【最短路】【图论】【Floyed】牛的旅行(ssl 1119/luogu 1522)
  5. dynamodb管理ttl_如何使用DynamoDB TTL和Lambda安排临时任务
  6. linux delete内存不下降_linux内存分配管理
  7. python月球地球质量计算_我们如何计算一个行星的质量?
  8. AngularJs ngList、ngRepeat、ngModelOptions
  9. 配置nessus服务在kali中开机自启动
  10. 华硕B85M-G主板安装心得
  11. 软件需求说明书/ 概要设计说明书/项目开发计划/详细设计说明书模版(说明要点及要点解释)
  12. java毕业设计茶叶销售网站Mybatis+系统+数据库+调试部署
  13. 英语四级词汇量测试软件,大学英语四级词汇量要求及自测卷
  14. pta基础编程题目集 7-1 厘米换算英尺英寸
  15. 微信oauth2.0授权
  16. java-php-python-ssm运动场所预约管理网站计算机毕业设计
  17. 即有分期 提前还款手续费就是不在办理的时候告诉你
  18. 数字逻辑设计基础(何建新)第三章
  19. CISSP基本概念与常见名词
  20. 【TextView】Android TextView显示省略号的问题(关于TextView maxLength 和maxEms的学习)

热门文章

  1. Linux下第一个java程序没有成功
  2. Cesium在地球上添加一个3D立方体
  3. Linux安装mysql学习
  4. mysql插入大量数据总结
  5. javap使用实例图解
  6. 修改Thickbox,预加载图片和点击图片前后浏览
  7. Object类-try-catch-finally-throw-throws-自定义异常
  8. 多媒体应用-swift
  9. nginx做正向代理
  10. python网络安全宣传周_Python