我有一个MySQL DB,在表中有50 GB数据和200M记录。我正在运行以下查询,需要350秒才能完成:

SELECT  x_date, count(*) as totl
    FROM  `rec_ex_15`
    WHERE  x_date > '2014-12-01'
      and  typx = '2'
    group by  x_date
    order by  x_date desc


x_date和typx被索引。

这里是解释:

id     select_type table       type     possible_keys  key     key_len  ref    rows
1      SIMPLE      rec_ex_15   range    typx,x_date    x_date  3        NULL   15896931  Using where


有什么方法可以更快地获得结果?

最佳答案

如评论中所述,您的查询非常简单。最好在(typx,x_date)上具有覆盖/复合索引

首先是typx ='2',然后索引可以直接跳到日期条件并获取结果。

您可以(将来,考虑创建一个单独的汇总表,例如每种类型和日期的计数,如果要处理2亿条记录,则可以从中获取汇总表。

澄清索引(typx,x_date)

由于您要查找特定的“ typx”,因此您希望索引的第一个位置是x_date,第二个是x_date。将索引想像成一堆盒子。每个框仅包含1个“ typx”值的实例(1、2、3等)...在框中(在您的情况下,typex ='2'),然后按x_date对其进行排序。因此,在typx = 2的框中,您可以直接跳到相关日期,获取记录并完成操作。

如果索引仅基于x_date(如您所能使用的那样),则假定房间中的每个框都包含一个日期。是的,您可以直接跳到列表的起始日期,但是随后您必须进入框并浏览所有条目以提取出任何typx = 2记录。现在,关闭第1天的框,并转到下一个框日期,然后查找任何typx = 2,依此类推。

根据您的条件建立有效的索引可以极大地帮助查询。

09-26 12:05