优化一个非常大的 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 FROM rec_ex_15 WHERE x_date > '2014-12-01' group by r_pass order by totl desc” @blacksun,虽然是另一个问题,类似的分析。按日期范围没有具体的事情,而是全部,所以在( x_date, rpass )上建立索引,并且如答案中所述,对于如此大的数据,在您关心的“事物”上预先汇总表可能更实用......特别是因为旧数据无论如何都会更加静态。 预聚合讨论:Summary Tables

以上是关于优化一个非常大的 mysql 表(查询或 mysql)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的limit 优化

MySQL Optimization

ES大数据量下的查询优化

mysql分页查询优化

mysql如何避免回表查询

大表的mysql性能问题