【问题标题】:MySql query with conditional group by performance具有条件组的 MySql 查询按性能
【发布时间】:2013-07-02 07:17:19
【问题描述】:

我有一个包含大约 1 000 000 行的非常简单的表,我想从中检索一些汇总统计信息。不是分析请求,是用户数据。我可以使用 3 个单独的查询来检索数据,每个查询都带有特定的 where 子句。但这将是对我的数据库服务器的三个查询。而且我还可以使用 conditional ORDER BY 子句进行一次查询。但我在生产的早期从未使用过这样的查询。我应该预料到它会遇到一些麻烦吗?

CREATE TABLE t1 (id INTEGER, fk_1 INTEGER, field_1 INTEGER, field_2 DATETIME);
 ... INSERT INTO t1 ... # 1 000 000 times

SELECT COUNT(*) FROM t1 
WHERE fk_1 = <some_value> 
GROUP BY CASE WHEN (field_1 = 1) THEN 1 ELSE (CASE WHEN field_2 > NOW() THEN 0 ELSE -1 END) END;

【问题讨论】:

  • 我不认为这有什么区别,但是您可以只使用一个 CASE 语句与两个 WHEN 子句和一个 ELSE,而不是嵌套它们。

标签: mysql performance sql-order-by


【解决方案1】:

尝试在计数中使用ID

SELECT COUNT(ID) FROM t1 
WHERE fk_1 = <some_value> 
GROUP BY CASE WHEN (field_1 = 1) THEN 1 ELSE (CASE WHEN field_2 > NOW() THEN 0 ELSE -1 END) END;

【讨论】:

  • 这真的有影响吗?
  • 是的。性能方面。或使用索引或键 (id) 本身。
  • in InnoDB 引擎的速度应该会有小幅提升
  • 我认为性能主要来自WHERE 子句的索引。
  • 是的,我完全同意...也许他可以向我们展示一个EXPLAIN 输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
相关资源
最近更新 更多