如何优化mysql中的大表?

Posted

技术标签:

【中文标题】如何优化mysql中的大表?【英文标题】:How can I optimize large table in mysql? 【发布时间】:2013-06-18 21:09:00 【问题描述】:

我有一个包含近 30 M 记录的表,大小为 6.6 GB。我需要从中查询一些数据并使用 group by 和 order by。查询数据的时间太长了,我多次失去与数据库的连接......

我在所有必要字段上都有索引作为键和复合键。我还能做些什么来加快查询速度?

查询示例:

select id, max(price), avg(order) from table group by id, date order by id, location.

【问题讨论】:

你应该只指定需要的列,避免在选择查询中使用 * 您在任何地方都有WHERE 子句吗?如果您要提取 30M+ 记录,我预计行为会很慢。事实上,您的 php 脚本可能会超时。 我不知道这是否适合您,但它可能是一个很好的机会,可以在 mongodb 或 couchbase 等 nosql 数据库中使用 map reduce 范例。 删除所有索引并尝试这个(id,date)。 【参考方案1】:

使用EXPLAIN query,其中查询是您的查询。例如:EXPLAIN select * from table group by id, date order by id, location

您将看到一个表,mysql 会在其中分析您的查询并显示它要查找的索引。可能你没有足够的(足够上帝)索引。

【讨论】:

我以前试过这个。但是在 mysql 中,这并没有给你正确的答案。例如,我已经在 id 上有索引,但是当我解释 select * from table order by id 时,它仍然在键下显示 null。 @Suanmeiguo 你能粘贴解释语句的准确输出吗?这将有助于给你任何提示【参考方案2】:

我不认为你可以。如果没有过滤器(WHERE 子句)和 AVG,则必须读取整个表。

我唯一能想到的就是拥有一个带有 ID、AVG_ORDER、MAX_PRICE(或任何您需要的)的新表,并在您插入/更新新行时使用触发器或存储过程来更新它。

如果您不需要那个讨厌的平均值,ID,PRICE 索引可能会对您有所帮助。

【讨论】:

【参考方案3】:

索引对您没有任何好处。您正在平均一列,因此您必须阅读表中的每一行。这需要时间。

【讨论】:

以上是关于如何优化mysql中的大表?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中的大表上的内存效率(常量)和速度优化迭代

MySQL 对于千万级的大表要怎么优化?

MySQL 对于千万级的大表要怎么优化?

MySQL 对于千万级的大表要怎么优化?

记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案

MySQL 对于千万级的大表要怎么优化?