--数据库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 两个值。=======
有什么好的办法吗?

解决方案 »

  1.   

     LEFT(logtime, 7)='2013-04‘这句改成  logtime >'2013-04' and logtime <'2013-05'
      

  2.   

    LEFT(logtime, 7)='2013-04':无法用到索引
    最好logtime用日期型
      

  3.   

     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;