现在有两种方法可以在 MySQL 中构建表的索引:
在第一个过程中,我们将拥有连续的数据(所有字段)页面,然后是索引页面。所以当我们使用索引查询时,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)