我开发了一个使用mysql + php的账单摘要页面。
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?)
答案 0 :(得分:1)
如果您在(userid,type)上创建复合索引并执行此操作,则会有所不同:
where userid = ? and type in (a,b)
and publish_date between...
group by publish_date
答案 1 :(得分:0)
您可以尝试通过explain
命令运行查询。
但是,我猜想添加其中一个索引会有所帮助(取决于找到匹配类型的行的频率):
这应该允许它仅查询查询的索引(减少读取的页数),以及允许索引范围扫描(或任何MySQL调用它)来构建实际数据。
另一种选择是运行预定(可能是夜间?)流程来为“重度”用户建立数据,并在显示报告时使用这些数据。
答案 2 :(得分:0)
MySQL 5.1.3服务器支持分区。 你可以参考mysql分区,网址是http://dev.mysql.com/doc/refman/5.1/en/partitioning.html