我有一个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,依此类推。
根据您的条件建立有效的索引可以极大地帮助查询。