算法目的:分批处理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啊?
解决方案 »
- 安装SHOPEX MYSQL出现问题,请高手帮忙
- MySQL 5.0数据库的最大连接数能否改为5000?
- 求sql语句
- 利用socket和直接连入数据库哪个更好
- C++动态执行SQL语句问题
- 系统重装,mysql怎样处理
- postgresql qq群 :27831241
- Mysql 建表问题 :提示字段长度过长,怎么办呀?急急急
- 1000分送上:::在线等待 我不小心用mysqlfront把一个数据库删除了,能不能恢复(没有备份),大家一定要救我阿。
- 怎样将mysql驱动加到jbuilder中,让Database pilot能认得出,高分相送
- 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 主键,我觉得差距不大,不是没有差;