【问题标题】:Query with MAX DATE and GROUP BY COLUMNS doesn't use Indexes使用 MAX DATE 和 GROUP BY COLUMNS 的查询不使用索引
【发布时间】:2025-12-28 13:05:17
【问题描述】:

我有 posts 表,包含 100K 行,具有以下架构:

CREATE TABLE `posts` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `subject` VARCHAR(50) NULL,
    `message` VARCHAR(200) NULL,
    `user_id` INT NOT NULL,
    `status` TINYINT NULL,
    `created_at` DATETIME NULL,
    INDEX `user_id` (`user_id),
    INDEX `created_at` (`created_at`),
    PRIMARY KEY (`id`)
);

我正在尝试执行以下查询以获取按用户和发布状态分组的最后创建日期的 user_id:

SELECT `user_id`, `status`, max(`created_at`) 
FROM `posts`
GROUP BY `user_id`, `status`;

这个选择查询花费了很多时间,当我对选择查询进行解释时,它根本没有使用任何索引。如何重写查询以使用索引并使其更快。

【问题讨论】:

  • 欢迎来到 SO。感谢您认真地写好您的问题。

标签: mysql database indexing group-by query-optimization


【解决方案1】:

您将能够通过此覆盖索引完全满足您的查询。

ALTER TABLE posts ADD INDEX id_status_date (user_id, status, created_at DESC);

这应该很快。

MySQL 仍然需要扫描索引的所有 100K 行。没有什么魔法可以瞬间汇总整个大表。

【讨论】:

    【解决方案2】:

    使用group by 列创建索引:INDEX (user_id, status)

    【讨论】:

      【解决方案3】:
      INDEX(user_id, status, created_at)
      

      优化器将遍历表找到每个“MAX”。触摸的行数将等于输出中的行数。

      另外,删除它,这样 Optmizer 就不会误用它:

      INDEX `user_id` (`user_id`)
      

      【讨论】: