起点:据我了解,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表,我不知道这在这里是否重要......
那么:为什么不避免文件排序呢?我错过了什么?
注意:数据库和表名称已编辑。
这是一个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 .