一个mysql group by 优化问题
大家讲道理
大家讲道理 2017-04-17 11:02:42
[MySQL讨论组]

表结构

iMoney  类型:float   
dtEventTime  类型:datetime   
iType 类型:tinyint   
iAction 类型:tinyint

现在存在的索引(test)是:
iType 跟 dtEventTime 的一个组合索引

select sum(iMoney) as iMoney,iAction from CostMoney where iType = 3 and dtEventTime between '2012-09-29' and '2012-09-30' group by iAction

这条语句查询后explain 下

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE  CostMoney   range   test    test    9   NULL    3893    Using where; Using temporary; Using filesort

这个表里面的数据每天特别大 , 请问有什么好的优化办法?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(3)
PHPz

给你点建议:
1、按天分表,这样每个表就不会那么大
2、用另一个缓存、或者表专门累加iMoney,每天的分记录,产生一条累加一次
3、group by iAction order by NULL ?(天知道有没有效果)

阿神

首先,dtEventTime必须要有索引的。而且dtEventTime类型应该是int,不应该使用date的。否则索引效率太低。
其次,分析这个sql的频率高么?
如果只是几次之类的话,而且数据要求不是实时的话,可以考虑循环取数据,程序里面做group和sum的功能。
如果很频繁,数据要求实时,只能考虑单独对每一个iAction建立单独的计数器。
最后,sql应该尽量简单,最理想的情况每次取数据都走索引。数据库更多的是存数据,尽量减少每次sql的cup和io资源。数据库的资源很宝贵,扩展成本比较高。

黄舟

每天分表不太靠谱了,不过还是要看你的数据量。
首先要对自己的数据量进行估计,每天多少数据,这些数据要如何查询,历史数据访问频率如何,有无热点数据。
大到什么程度!结合索引,分库,分表,分字段,不断测试,不断观察!!不断调整策略。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号