小编use*_*770的帖子

MySQL 索引创建内幕

现在有两种方法可以在 MySQL 中构建表的索引:

  1. 首先创建表结构,然后导入数据并添加索引。
  2. 创建带有索引的表结构,然后导入数据。

在第一个过程中,我们将拥有连续的数据(所有字段)页面,然后是索引页面。所以当我们使用索引查询时,MySQL 必须首先加载索引页并找出匹配的键,并且必须在数据页上查找那些主键。为此,它必须再次加载数据页以获取数据。当我们有更大的索引扫描时这很有用,因为我们所有的索引都是连续加载的。

在索引创建的第二种方式中,过滤后的索引页很可能包含与它们同时创建的靠近它的数据页。所以我想小范围扫描的查找速度会更快。

我的理解正确吗?

更新:

我应该在第一种导入数据的方式中提到“PRIMARY KEY 已启用”(自动递增 id 列)。因此,不会生成内部 rowid,并且由于我们不打算添加 PRIMARY KEY,因此会保存大量 IO。

正如您所指出的,当我们使用第二种方法导入数据时会出现碎片。

考虑到我的要求是更大范围的扫描(扫描~100M 行),我想我会采用第一种导入数据的方式。

6 月 8 日 11:30 更新

CREATE TABLE `table_dummy` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `column1` bigint(20) DEFAULT NULL,
  `column2` bigint(20) DEFAULT NULL,
  `column3` bigint(20) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `column4` tinyint(1) DEFAULT NULL,
  `column5` tinyint(4) DEFAULT NULL,
  `column6` bigint(20) DEFAULT NULL,
  `column6_created_at` datetime DEFAULT NULL,
  `column7` int(11) DEFAULT NULL,
  `column8` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`), …
Run Code Online (Sandbox Code Playgroud)

mysql innodb index mysql-5.6

5
推荐指数
1
解决办法
594
查看次数

标签 统计

index ×1

innodb ×1

mysql ×1

mysql-5.6 ×1