mysql 600W数据 分组查询

cfd406635982 2013-04-27 04:24:30

--数据库mysql 5.X

--创建表的语句
CREATE TABLE TABLE_A (
`id` int(11) NOT NULL AUTO_INCREMENT,
`logtime` datetime DEFAULT NULL ,
`isFirst` int(11) NOT NULL DEFAULT '0' COMMENT '只有0/1',
`name` varchar(15) DEFAULT NULL,
`uid` varchar(100) DEFAULT NULL,
`sended` int(11) NOT NULL DEFAULT '0' COMMENT '只有0/1',
PRIMARY KEY (`id`),
KEY `logtime` (`logtime`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
--数据 太多了。模拟给一条吧。
INSERT INTO `table_a` VALUES (1,'2013-04-27 01:02:03',0,'jack','13243423',0);

-- 查询语句
SELECT uid, count(*) as count, name, GROUP_CONCAT(id) FROM TABLE_A
WHERE (isFirst=0 and sended=0) and LEFT(logtime, 7)='2013-04'
GROUP BY uid HAVING count >= 15
limit 0,10000;



这个表的数据量大约600--800W
如果不分页的话,基本上每次查询出来的结果在10-20W行左右,
由于是分组,每个分组的数量大概在5-60条记录吧,所以关联的记录大概在100W左右。
数据需要查询出来再处理,几十万一次加载到内存太多了,所以分页。
但是效率特别低,其中有一个GROUP_CONCAT(id) 这个也比较影响性能。
但是我需要知道每次分组后的ID,以便更新值。
其中isFirst 和 sended 只有0和1 两个值。

=======
有什么好的办法吗?
...全文
243 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2013-04-28
  • 打赏
  • 举报
回复
create index xx on TABLE_A(isFirst,sended,uid,logtime); SELECT uid, count(*) as count, name, GROUP_CONCAT(id) FROM TABLE_A WHERE (isFirst=0 and sended=0) and logtime between '2013-04-01' and '2013-04-30 23:59:59' GROUP BY uid HAVING count(*) >= 15 limit 0,10000;
wwwwb 2013-04-28
  • 打赏
  • 举报
回复
LEFT(logtime, 7)='2013-04':无法用到索引 最好logtime用日期型
rucypli 2013-04-27
  • 打赏
  • 举报
回复
 LEFT(logtime, 7)='2013-04‘ 这句改成 logtime >'2013-04' and logtime <'2013-05'
cfd406635982 2013-04-27
  • 打赏
  • 举报
回复
大哥些。。没人回答吗?。。

56,912

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧