优化一个非常大的 mysql 表(查询或 mysql)
Posted
技术标签:
【中文标题】优化一个非常大的 mysql 表(查询或 mysql)【英文标题】:Optimizing a very huge mysql table (query or mysql) 【发布时间】:2014-12-26 15:16:31 【问题描述】:我有一个 mysql 数据库,表中有 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
有什么方法可以更快地得到结果?
【问题讨论】:
您是否有专门针对 (typex, xdate) 而不是单独的索引。 不,我只有一个人 【参考方案1】:如评论中所述...您的查询非常简单。您最好在 (typx, x_date ) 上有一个覆盖/复合索引
先将typx = '2',然后索引可以直接跳转到日期条件并获取结果。
您可以(将来考虑创建一个单独的聚合表,例如每种类型和日期的计数,然后如果您要处理 2 亿条记录,则从中获取聚合。
明确索引(typx, x_date)
由于您正在寻找特定的“typx”,因此您希望它位于索引的第一个位置,第二个位置是 x_date。把索引想象成一个盒子的房间。每个框仅包含一个“typx”值(1、2、3 等)的实例......在框内(在您的情况下为 typx = '2'),然后按 x_date 对它们进行排序。因此,在 typx = 2 的框中,您可以直接跳转到相关日期,获取记录并完成。
如果索引仅基于 x_date(如您所拥有的那样),则假设房间中的每个框都包含一个日期。是的,您可以直接跳到开始您的列表的日期,但是您必须进入该框并查看所有条目以提取任何 typx = 2 记录。现在,关闭第 1 天的框并转到下一个框日期并查找任何 typx = 2 等等。
根据您的标准建立一个有效的索引可以极大地帮助查询。
【讨论】:
感谢您的回答。我需要优化 my.cnf 吗?还有你所说的“typx = '2' first”是什么意思。关于您的推荐,您是否建议我创建一个表格并进行计算和编辑? @blacksun,为澄清索引而修订 非常感谢。还有一个问题我需要做什么才能使用这样的查询“SELECT r_pass, count(*) as totl FROMrec_ex_15
WHERE x_date > '2014-12-01' group by r_pass order by totl desc”
@blacksun,虽然是另一个问题,类似的分析。按日期范围没有具体的事情,而是全部,所以在( x_date, rpass )上建立索引,并且如答案中所述,对于如此大的数据,在您关心的“事物”上预先汇总表可能更实用......特别是因为旧数据无论如何都会更加静态。
预聚合讨论:Summary Tables以上是关于优化一个非常大的 mysql 表(查询或 mysql)的主要内容,如果未能解决你的问题,请参考以下文章