我有一个简单的查询分组行需要 0.0045 秒。300.000 行
SELECT cid FROM table GROUP BY cid
当我添加 MAX() 进行查询时,需要 0.65 秒才能返回。
SELECT MAX(id) id, cid FROM table GROUP BY cid
我怎样才能加快这个查询?该查询在我的本地主机上运行以进行测试。id = 主键,我在 cid 上有索引。
原因是两个查询之间的差异:
因此,要回到更优化的第一种情况,您需要一个索引,它可以同时提供:按 cid 和最小/最大 id 分组。您可以尝试通过在 (cid,id) 上创建索引来实现此目的
我会尝试在 cid 和 id 上添加复合索引。这可能会替换 cid 上的现有索引。我建议您分析一些典型的查询来评估增加现有索引大小的影响。复合索引恰好包含满足查询所需的数据,因此应尽量减少所需的工作。
MySQL 使用基于成本的优化。成本计算基于 i/o 的数量,因此,如果您可以仅在感兴趣的列上放置索引,则应该最小化 i/o 并导致最佳查询。
查看 mysql 手册中有关加快 max() 、 min() 查询的内容
MySQL 对这些操作使用索引:
查找特定索引列 key_col 的 MIN() 或 MAX() 值。这是由预处理器优化的,该预处理器检查您是否在索引中 key_col 之前出现的所有关键部分上使用 WHERE key_part_N = constant。在这种情况下,MySQL 为每个 MIN() 或 MAX() 表达式执行单个键查找,并将其替换为常量。