mysql - 使用 group by、where 和 'flag' 优化单表查询

标签 mysql sql performance

我正在为我反复使用的查询类型的性能而苦苦挣扎。任何帮助将不胜感激。

我有下表:

    item week type  flag   value
    1    1    5     0      0.93 
    1    1    12    1      0.58 
    1    1    12    0      0.92 
    1    2    6     0      0.47 
    1    2    5     0      0.71 
    1    2    5     1      0.22
    ...  ...  ...   ...    ...

(全表约10k条,200周,1k种,flag为0或1,共约2000万行)

我想优化以下查询:

    select item, week, 
    sum(value) as total_value,
    sum(value * (1-least(flag, 1))) as unflagged_value
    from test_table 
    where type in (5,10,14,22,114,116,121,123,124,2358,2363,2381) 
    group by item, week;

目前,我能获得的最快速度是在(类型、项目、周)和引擎 = MyIsam 上建立索引。 (我在标准桌面上使用 mysql)。

您有什么建议(指数、重新制定等)吗?

最佳答案

据我所知,GROUP BY 查询只能使用 covering index. 进行全面优化

在您的表中添加以下覆盖索引并使用EXPLAIN检查:

ALTER TABLE test_table  ADD KEY ix1 (type, item, week, value, flag);

在使用 EXPLAIN 添加索引检查后:

SELECT type, item, week,
    SUM(value) AS total_value,
    SUM(IF(flag = 1, value, 0)) AS unflagged_value
FROM test_table
WHERE type IN(5,10,14,22,114,116,121,123,124,2358,2363,2381)
GROUP BY type, item, week;

您可能需要像这样修改您的查询:

SELECT item, week,
       SUM(total_value) AS total_value,
       SUM(unflagged_value) AS unflagged_value
FROM(
    SELECT type, item, week,
        SUM(value) AS total_value,
        SUM(IF(flag = 1, value, 0)) AS unflagged_value
    FROM test_table
    GROUP BY type, item, week
)a
WHERE type IN(5,10,14,22,114,116,121,123,124,2358,2363,2381)
GROUP BY item, week;

查看查询执行计划。 SQLFIDDLE DEMO HERE

关于mysql - 使用 group by、where 和 'flag' 优化单表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12088507/

相关文章:

mysql - 返回查询中每个 ID 的第一个

java - 在java中单个语句中执行多个查询

android - 可以从 Android 中的 RAM 运行 apk 以获得更高的性能吗?

SQL内连接与左连接问题

c - #include .c 源文件是否可以用于嵌入式 C 代码的可维护性?

php - 在帖子旁边显示用户图片

mysql - 合并两个没有关系的表的列

mysql - 在 MySQL 的父子关系中强制执行 "favorite"的最佳方法是什么?

java - JOOQ如何将时间戳和表示毫秒的整数相加?

sql - 数据库字尾字符数限制?