gpt4 book ai didi

mysql - 主键是否隐式存储在mysql myisam引擎中的其他键中?

转载 作者:行者123 更新时间:2023-11-29 06:01:07 26 4
gpt4 key购买 nike

我的问题:想象一个有数百万行的表,比如

CREATE TABLE a {
id INT PRIMARY KEY,
column2..,
column3..,
many other columns..
..
INDEX (column2);

和这样的查询:

SELECT id FROM a WHERE column2 > 10000 LIMIT 1000 OFFSET 5000;

我的问题:mysql 是否仅使用索引“column2”(因此主键 id 被隐式存储为其他索引中的引用),还是它必须获取所有行以获取 id,这是为输出?在这种情况下,使用声明为键的查询应该快得多:

INDEX column2(column2, id)

最佳答案

简短回答:否。

长答案:

与 InnoDB 不同,MyISAM 有一个“指针”指向每个索引的叶节点中的数据,包括 PRIMARY KEY

因此,INDEX(col2) 本质上是 INDEX(col2, ptr)INDEX(id)INDEX(id, ptr) 也是如此。

“指针”是 .MYD 文件中的字节偏移量(对于 DYNAMIC)或记录号(对于 FIXED)。在任何一种情况下,指针都会导致对 .MYD 文件的“搜索”。

指针默认为 6 字节数字,允许大量行。它可以通过设置进行更改,以节省空间或允许更大的行数。

对于您的特定查询,INDEX(col2, id) 是最佳且“覆盖”的。对于 MyISAM,它优于 INDEX(col2),但它们对于 InnoDB 是等效的,因为 InnoDB 在每个二级索引中隐式地具有 PK。

查询必须扫描至少 5000+1000 行,至少在索引的 BTree 中。

请注意,InnoDB 的 PRIMARY KEY 与数据聚类,但 MyISAM 的 PRIMARY KEY 是一个单独的 BTree,就像其他二级索引一样。

你真的应该考虑转向 InnoDB;今天几乎没有理由使用 MyISAM。

关于mysql - 主键是否隐式存储在mysql myisam引擎中的其他键中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44831229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com