优化一个非常庞大的mysql表(查询或mysql)

时间:2014-12-26 15:16:31

标签: mysql indexing bigdata

我有一个包含50 GB数据和200M记录的mysql DB。我正在运行以下查询,需要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

有没有办法让结果更快?

1 个答案:

答案 0 :(得分:2)

如评论中所述......您的查询非常简单。您最好在(typx,x_date)

上设置覆盖/复合索引

首先是typx ='2',然后索引可以直接跳转到日期标准并获得结果。

您可以(将来考虑创建一个单独的聚合表,例如每种类型和日期的计数,如果您正在处理200m记录,则从中获取聚合。

澄清索引(typx,x_date)

由于您正在寻找特定的“typx”,您希望它位于索引的第一个位置,辅助是x_date。把索引想象成一个盒子的房间。每个框只包含1个“typx”值的实例(1,2,3等)...在(在您的情况下为typx ='2')的框中,它们按x_date排序。因此,在typx = 2的框中,您可以直接跳转到相关日期,抓取记录并完成。

如果索引仅基于x_date(如您所用),则假设会议室中的每个框都包含一个日期。是的,你可以直接跳到列表开始的日期,但是你必须进入框并查看所有条目以提取任何typx = 2记录。现在,关闭第1天的方框并转到下一个方框日期并查找任何typx = 2等等。

根据您的标准获得有效的索引可以极大地帮助查询。