通过在mysql中与where条件一起使用来优化组

通过在mysql中与where条件一起使用来优化组,mysql,sql,database,myisam,database-optimization,Mysql,Sql,Database,Myisam,Database Optimization,我有一个大约有8M行和35列的表(总大小为1G)。这用于涉及多级分组依据条件的报告。这里有一个这样的问题 explain select min(a), max(a), avg(a), sum(b) from test where (c=2 or c=20 or c=18 or c=21 or c=12) and d>='2013-01-01' and d <= '2013-12-01' group by c,e; *************************** 1. row

我有一个大约有8M行和35列的表(总大小为1G)。这用于涉及多级
分组依据
条件的报告。这里有一个这样的问题

explain select min(a), max(a), avg(a), sum(b) from test where (c=2 or c=20 or c=18 or c=21 or c=12) and d>='2013-01-01' and d <= '2013-12-01' group by c,e;

*************************** 1. row ***************************
       id: 1
select_type: SIMPLE
    table: test
     type: range
possible_keys: PRIMARY
      key: PRIMARY
  key_len: 7
      ref: NULL
     rows: 154911
    Extra: Using where; Using temporary; Using filesort
1 row in set (0.00 sec)

解释从测试中选择最小(a)、最大(a)、平均(a)、和(b),其中(c=2或c=20或c=18或c=21或c=12)和d>='2013-01-01'和d如果使用(c、d、e、a、b)进行索引,则性能会更快。这将是一个覆盖索引,表扫描不会像现在这样进行

另外,我只是好奇,你能给我一些关于你正在使用的有效功能的建议吗


另外,一个重要的问题是索引大小。每个表的最大索引数和最大索引长度由每个存储引擎定义。你可以阅读更多关于它的内容。在你的情况下,这将不是一个问题,因为你正在处理我假设的日期和数字。只是插入的速度会慢一些。

覆盖索引可能会有所帮助。假设这是您的查询:

select min(a), max(a), avg(a), sum(b)
from test
where (c=2 or c=20 or c=18 or c=21 or c=12) and
      d >= '2013-01-01' and d <= '2013-12-01'
group by c, e;
选择最小值(a)、最大值(a)、平均值(a)、总和(b)
从测试
式中(c=2或c=20或c=18或c=21或c=12)和

d>='2013-01-01'和d在任何SQL中,无论出于何种原因,如果只对一个表执行多个扫描,我们都可以对其中任何一个表使用一个索引,但不能同时使用这两个索引

例:您的查询需要

  • 一次扫描以处理where子句数据。(INDEX1:c,d上的索引很有用)
  • 一次扫描,对分组操作的结果集进行排序。(INDEX2:c、e上的索引很有用)
  • 如果结果集中的行数更多,最好添加INDEX2,这样排序会更快。
    如果结果集中的行数较少,最好添加INDEX1,以便快速处理where子句。

    FWIW,我更喜欢\G来解释您的查询引用未定义的表别名
    d
    d.effective\u date
    )。。生效日期仍然是一个错误。。。我对查询进行了编辑以使其更有意义。此查询返回多少行?请注意有关日期的查询。如果您打算全年(截至2013年12月31日),并且您的交易记录在日期/时间字段中有时间部分,那么这将不包括所有12月31日的数据,因为2013年12月31日凌晨3:15的数据大于2013年12月31日凌晨12:00的数据。你应该考虑少于2014年1月1日,所以它一直到12月31日11:59:59PM。我不想把实际的查询。生效日期错误地保留在那里。。现在请看这个查询。。在(c,d,c,e,a,b)上创建索引是你的建议将变成的,我认为。。。但我们不能在索引中多次放置同一列。。。我们可以吗?请现在看看。我已经修改了答案。谢谢你的建议。。我试过这个。。但性能恶化,扫描行数膨胀到450000。。。在任何情况下,这个查询都不是我唯一的用例,我不知道我可以为每个用例创建太多的复合索引。在运行这个查询之后,你可以运行优化表吗?那就去看演出吧,请让我也去看一下。。没有变化。。。我的表中的行根本不会得到更新。。我们定期截断并再次插入所有行。。所以优化表不应该提高性能