算法目的:分批处理A表全部记录,并每条记录只处理一次。已知条件:
1,数据库为mysql。
2,处理中A表中的记录不会被其他程序增加或修改或删除。即A表为固定表。
3,A表有唯一主键,并不存在其他索引。算法顺序:
1,select * from A limit 1000 offset 0;得到x条记录并进行处理。
2, if (x < 1000) 认为全部记录已经被处理完毕。
else 重复顺序1(其中offset = offset + 1000)乍看上去好像没有什么问题,但是我觉得上述算法存在的问题:
把算法顺序1中的SQL文改成select * from A order by pk limit 1000 offset 0,就严谨了,但是order by pk(pk为主键)一加上去,就付出了using temporary和using filesort的代价。放到谁都很不愿意加order by,但是有没有理论支持可以不加order by啊?
1,数据库为mysql。
2,处理中A表中的记录不会被其他程序增加或修改或删除。即A表为固定表。
3,A表有唯一主键,并不存在其他索引。算法顺序:
1,select * from A limit 1000 offset 0;得到x条记录并进行处理。
2, if (x < 1000) 认为全部记录已经被处理完毕。
else 重复顺序1(其中offset = offset + 1000)乍看上去好像没有什么问题,但是我觉得上述算法存在的问题:
把算法顺序1中的SQL文改成select * from A order by pk limit 1000 offset 0,就严谨了,但是order by pk(pk为主键)一加上去,就付出了using temporary和using filesort的代价。放到谁都很不愿意加order by,但是有没有理论支持可以不加order by啊?
解决方案 »
- 有关mysql中文大数据模糊搜索
- mysql不支持 同台机器两个mysql数据库之间做触发器???
- mysql中查询结果集中记录的条数时,出现段错误!
- 求助:现在有表A,表B,2个表都有字段id,请用左联方法写出一句sql,从2个表中找出id相等的纪录
- 谁用turboc 2.0 连过mysql数据库,怎么连?
- mysql备份文件达50M,用phpmyadmin导入出错,请高人指点
- 高手帮忙看看这个查询处理错在哪里?
- 一个关于mysql的问题,怎么将*.sql的数据库导入到localhost中
- 话题与回复
- 请问下我这条sql那里有问题
- INNODB最好用varchar,这个可以理解,但是为什么MYISAM建议用定长的数据列?
- 求SQL:MySQL下如何先order by 在group by,不使用subSelect?
比如下表
CREATE TABLE `temp_rcfc` (
`RCFC_KBN` CHAR(3) NOT NULL,
`RCFC_NM` CHAR(30) NOT NULL,
PRIMARY KEY (`RCFC_KBN`)
)
ENGINE=InnoDB
ROW_FORMAT=DEFAULTexplain select * from TEMP_RCFC r order by r.RCFC_KBN limit 1000 offset 0;
和explain select * from TEMP_RCFC r limit 1000 offset 0;
都不会出现using temporary或者using filesort。如果是父子表的话,通过join查询的话,加不加order by pk就会差很大。
比如:select * from TBL_NODE n, TBL_SHOP s where n.NODE_ID = s.NODE_ID and n.VALID=1 order by n.NODE_ID limit 1000 offset 0; 其中TBL_NODE是父表,TBL_SHOP是子表,两表通过NODE_ID主键来表示同一对象。这个时候有没有好一点的解决方法啊
楼主最好不要select * ,把需要的字段列出来;
都有?还是不加有?
2. 你的SELECT不包括任何WHERE条件,所以是全表扫描因此 不会使用,也没有必要使用索引。 因为INNODB的 聚集索引 会导致 输出会按 主键的顺序输出。但仍然保持程序的严谨,把ORDER BY加上。
using temprary :是需要一张临时表来;
加不加order by 没有差 我觉得不可能,除非数据量很少,或则order by 利用了索引;楼主order by 主键,我觉得差距不大,不是没有差;