我有一个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和典型值已编入索引。
以下是解释:
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
有没有办法更快地获得结果?
如评论中所述...您的查询非常简单。 您最好有一个覆盖/复合索引(典型值、x_date
首先 typx = '2',然后索引可以直接跳转到日期条件并获得结果。
您可以(将来,考虑创建一个单独的聚合表,例如每个类型和日期的计数,然后如果您正在处理 2 亿条记录,则从中获取聚合。
澄清索引(典型值,x_date)
由于您正在寻找特定的"typx",因此您希望索引的第一个位置和次要位置是x_date。 将索引想象成一屋子盒子。 每个框只包含"typx"值的 1 个实例(1、2、3 等)... 在 for 框中(在您的情况下 typx = '2'),然后按x_date对它们进行排序。 因此,在 typx = 2 的框中,您可以直接跳转到相关日期,获取记录并完成。
如果索引仅基于x_date(如您可用的索引),则假设房间中的每个框都包含一个日期。 是的,您可以直接跳转到列表开始的日期,但随后您必须进入框并查看所有条目以提取任何 typx = 2 条记录。 现在,关闭第 1 天的框并转到下一个框日期并查找任何 typx = 2,依此类推。
根据您的条件拥有有效的索引可以极大地帮助查询。