如果我理解正确,MySQL InnoDB 引擎中的二级索引叶节点保存表主键值(至少对于唯一索引)。
因此,在二级索引中查找一个值会导致两个 BTREE 查找:一个用于二级索引,另一个用于聚集索引(聚集在主键上)。这也意味着主键大小会影响所有二级索引的大小。
这也是 MongoDB WiredTiger 二级索引的工作方式吗?或者 MongoDB 二级索引是否存储对文档所在物理块的引用?(我相信这就是 Postgres 处理索引的方式)
如果我理解正确,MySQL InnoDB 引擎中的二级索引叶节点保存表主键值(至少对于唯一索引)。
因此,在二级索引中查找一个值会导致两个 BTREE 查找:一个用于二级索引,另一个用于聚集索引(聚集在主键上)。这也意味着主键大小会影响所有二级索引的大小。
这也是 MongoDB WiredTiger 二级索引的工作方式吗?或者 MongoDB 二级索引是否存储对文档所在物理块的引用?(我相信这就是 Postgres 处理索引的方式)
我有一个类似于以下的表(更新:添加了一个type
列**我猜太多简化了实际查询)
CREATE TABLE versions(
type INT NOT NULL,
version INT NOT NULL,
important BOOLEAN NOT NULL,
PRIMARY KEY (type, version)
)
运行SELECT type, MAX(version) FROM versions GROUP BY type
非常高效,并且从数据库中检索每种类型的单行。
但是,运行SELECT MAX(CASE WHEN important=1 THEN version END) FROM versions GROUP BY type
似乎会生成全表扫描。
由于我有一个版本索引,我希望 MySQL 从最高版本开始扫描,并在找到第一个具有“important=1”的版本时停止。通常,我的数据只需要扫描几行。
查看performance_schema.events_statements_history
(ROWS_EXAMINED
列)似乎 MySQL 扫描整个表以检索我需要的行。
任何有关如何提高此查询性能的想法都将不胜感激。