如何优化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 中的大表上的内存效率(常量)和速度优化迭代