延迟了结算明细页面的一些重度用户

时间:2010-10-19 23:13:39

标签: php sql mysql

我开发了一个使用mysql + php的账单摘要页面。

  • 有很多用户:(1M)
  • 轻用户:每个记录小于10K:0.99M用户
  • 重度用户:每个人都有大约1M记录

SQL如下:

SELECT SUM(value_a) A, SUM(value_b) B, SUM(value_c) C
FROM  daily_data_sep_2010
WHERE  user_id='<user_id>'
AND type
IN (
  'type_a',  'typeb'
 )
AND publish_date
BETWEEN  '<start_date>'
AND  '<end_date>'
GROUP BY publish_date
ORDER BY publish_date DESC 

daily_data_sep_2010表类型是MyISAM

有几种类型的相同查询,但是   SUM(value_a)A,SUM(value_b)B,SUM(value_c)C 真的相同(相等) “WHERE”,“GROUP BY”条件不一样

此屏幕对于重度用户来说非常慢。 你有什么好的解决方案吗?

解释在这里

| table | type | possible_keys | key | key_len | ref | rows | Extra |

| daily_data_sep_2010 | ALL | PRIMARY,user_id_key,类型,出版日期|||| 1059756 |使用地点;使用临时;使用filesort |

我认为行大小太大了。 所以我期待其他解决方案(Hadoop?)

3 个答案:

答案 0 :(得分:1)

如果您在(userid,type)上创建复合索引并执行此操作,则会有所不同:

       where userid = ? and type in (a,b)
       and publish_date between...
       group by publish_date

答案 1 :(得分:0)

您可以尝试通过explain命令运行查询。

但是,我猜想添加其中一个索引会有所帮助(取决于找到匹配类型的行的频率):

  1. user_id,type,publish_date,value_a,value_b,value_c
  2. user_id,publish_date,type,value_a,value_b,value_c
  3. 这应该允许它仅查询查询的索引(减少读取的页数),以及允许索引范围扫描(或任何MySQL调用它)来构建实际数据。

    另一种选择是运行预定(可能是夜间?)流程来为“重度”用户建立数据,并在显示报告时使用这些数据。

答案 2 :(得分:0)

MySQL 5.1.3服务器支持分区。 你可以参考mysql分区,网址是http://dev.mysql.com/doc/refman/5.1/en/partitioning.html