5

我有一个简单的查询分组行需要 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 上有索引。

4

3 回答 3

4

原因是两个查询之间的差异:

  • 您的第一个查询将永远不会触及表格 - 它仅依赖于索引
  • 您的第二个查询实际上需要命中所有行

因此,要回到更优化的第一种情况,您需要一个索引,它可以同时提供:按 cid 和最小/最大 id 分组。您可以尝试通过在 (cid,id) 上创建索引来实现此目的

于 2012-09-06T22:23:24.553 回答
1

我会尝试在 cid 和 id 上添加复合索引。这可能会替换 cid 上的现有索引。我建议您分析一些典型的查询来评估增加现有索引大小的影响。复合索引恰好包含满足查询所需的数据,因此应尽量减少所需的工作。

MySQL 使用基于成本的优化。成本计算基于 i/o 的数量,因此,如果您可以仅在感兴趣的列上放置索引,则应该最小化 i/o 并导致最佳查询。

于 2012-09-06T22:19:32.500 回答
0

查看 mysql 手册中有关加快 max() 、 min() 查询的内容

MySQL 对这些操作使用索引:

查找特定索引列 key_col 的 MIN() 或 MAX() 值。这是由预处理器优化的,该预处理器检查您是否在索引中 key_col 之前出现的所有关键部分上使用 WHERE key_part_N = constant。在这种情况下,MySQL 为每个 MIN() 或 MAX() 表达式执行单个键查找,并将其替换为常量。

于 2012-09-06T22:20:25.177 回答