我有一个包含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
有没有办法让结果更快?
答案 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等等。
根据您的标准获得有效的索引可以极大地帮助查询。