MySQL 未使用隐式附加到此二级索引的主键

问题描述 投票:0回答:1

起点:据我了解,MySQL 会在每个二级索引的末尾隐式添加主键。

我有一张桌子:

  • 主要索引
    id
  • project_id
  • 的二级索引

所以,我认为 MySQL 会使用二级索引

project_id
进行以下查询,而不需要文件排序:

SELECT * FROM db.table_name WHERE project_id = 5 ORDER BY `id` LIMIT 1;

但是,解释显示 PRIMARY 被用作密钥:

如果我在

project_id
列上使用force_index,则会使用索引,但(估计的)估计行数和“使用文件排序”显示主键未用于排序依据。

SELECT * FROM db.table_name FORCE INDEX (`project_id`) WHERE project_id = 5 ORDER BY `id` LIMIT 1;

这是一个MyISAM表,我不知道这在这里是否重要......

那么:为什么不避免文件排序呢?我错过了什么?

注意:数据库和表名称已编辑。

mysql indexing sql-order-by
1个回答
0
投票

这是一个MyISAM表,我不知道这在这里是否重要......

确实如此。

主键附加到辅助键的特性是特定于InnoDB的实现的。

https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html 说:

在InnoDB中,二级索引中的每条记录都包含该行的主键列,以及为二级索引指定的列。

(强调我的)

MyISAM 不以这种方式存储索引。在MyISAM中,主键索引和辅助索引是类似的;两者都存储要索引的值以及在表数据中找到这些值的记录的偏移量。主键值不与辅助键组合。

您应该知道 MyISAM 正在逐渐从 MySQL 中淘汰。 MyISAM 不支持 ACID 属性,也不支持事务、外键、行级锁、并发更新等。通常,自 2010 年 InnoDB 成为默认存储引擎以来,除了极少数情况外,我没有使用过 MyISAM .

© www.soinside.com 2019 - 2024. All rights reserved.