0

MySQL InnoDB存储引擎

当索引(二级)生效时, 会先走二级索引, 然后走聚簇索引找到数据

那如果索引不生效时, 要做全表扫描时, 还会走 聚簇索引 么?
我理解的是会走, 因为InnoDB的数据和聚簇索引是一体的

那如果Innodb的全表扫描会走聚簇索引的话, 而 MyISAM 不走, 那是不是走索引的比不走索引的要快呢?
想知道InnoDB全表扫描时如何走聚簇索引的?

wahaha 226
2019-04-25 提问
2 个回答
1

已采纳

首先要明确的是,聚簇索引不是一种单独的索引类型,而是一种数据存储方式,各个引擎的实现可能不太一样。

对于 InnoDB 而言,如果表有聚簇索引,它的数据行数据实际上就存放在主键索引的叶子页中。也就是说,可以直接通过主键索引获取到行数据。这就是 InnoDB 的聚簇索引。

对于题主的描述
1、在有聚簇索引时,二级索引生效后,实际上是通过二级索引找到对应主键,然后通过主键索引找到存放的数据。
2、索引不生效,用不到主键索引,就不会使用主键上聚簇的行数据。
3、不使用任何索引,走全表扫描的话,理论上来讲,如果表有 1000 行数据,都需要 1000 次 IO 操作,也就不用比较谁快谁慢了。

如有疑惑,欢迎进一步探讨,望采纳!

1

是的

北国风光 · 4月25日

展开评论
1

老铁,首先你要弄清楚什么是innodb,什么是myisam哦
innodb表的数据本身就是聚集的,也就是说,表本身就是聚集索引,全表扫描,扫的就是当然就是聚集索引本身咯。
myisam表是堆表,数据存储并不是根据主键聚集的。

innodb走全表扫描,就是从聚集索引最左端叶子块一直往右遍历咯,跟全索引扫描差不多。

而同样是全表扫描,innodb是不是比myisam快呢?我的理解是myisam比innodb快哦。
因为对于同样的数据,由于存储引擎对数据的组织和存储原理不一样,myisam表是比innodb表小的,那么在数据块大小一定的情况,表小,也就说整个表的数据块数量少,所以全表扫描过程需要读取的数据块的IO就少了哦。一次IO是读一个数据块到buffer pool,而不是一行数据。

1

还有全表扫描innodb和myisam哪个快,我给你做个测试,test表是innodb,test1是myisam,两个表的结构和数据都相同,对比做全表扫描,就可以发现,myisam比innodb快了:


mysql> show create table test\G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `col1` int(11) DEFAULT NULL,
  KEY `idx_id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1048577 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

mysql> show create table test1\G
*************************** 1. row ***************************
       Table: test1
Create Table: CREATE TABLE `test1` (
  `id` int(11) DEFAULT NULL,
  `col1` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

mysql> select * from test;
1048576 rows in set (1.37 sec)

mysql> select * from test1;
1048576 rows in set (0.65 sec)

总是迟到 · 4月25日

1

是的

总是迟到 · 4月25日

展开评论

撰写答案

推广链接