2013-06-18 44 views
0

我有一张有近30 M记录的表格,大小为6.6 GB。我需要从中查询一些数据并使用group by和order by。查询数据花了我太多的时间,我多次失去与DB的连接......如何优化mysql中的大表?

我有索引所有必要的字段作为键和复合键。我还能做些什么来使查询更快?

例子查询:

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

那么你应该只指定所需的列并避免在select查询中使用* –

+1

你在任何地方都有一个WHERE子句吗?如果你正在拉动30M +记录,我会期望缓慢的行为。事实上,您的PHP脚本可能会超时。 –

+1

我不知道它是否适合你,但它可能是一个很好的机会,可以使用地图缩减范式在像mongodb或couchbase这样的nosql数据库中执行。 – jbaylina

回答

0

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

你会看到一个表,其中MySQL分析你的查询并显示它寻找哪个索引。可能你没有足够的(足够神)指数。

+0

我以前试过。但在MySQL中,这并不能给你正确的答案。例如,我已经有id的索引,但是当我通过id解释select * from table order时,它仍然在键下显示null。 – Suanmeiguo

+0

@Suanmeiguo你可以粘贴explain语句的确切输出吗?这将有助于给你任何提示 – ducin

0

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

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

一个关于ID的索引,PRICE索引可能会帮助你,如果你不需要那个讨厌的平均值。

0

索引对你没有任何好处。您正在对列进行平均,所以您必须读取表格中的每一行。这需要时间。