1
回答
再说在for循环中逐条进行数据库操作
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

记得前一阵有一个讨论很热烈,代码大致是这个样子的:

List ids =  XXXX.execute("select id from XXXX"); // 或者是 XXX.findAll()

for(int id : ids){

    Object obj = XXXX.get(id);

---------------------- 分割线 ----------------------

最近再看MySql数据库优化《高性能MySql》,看了索引部分后突然想到, 其实这样写是有一定道理的,原因如下。

  1.  select id from XXX  在默认使用B-Tree 索引的表上执行时,并不会真的去扫所有表,只需要扫索引就够了。 扫索引是很快的,如果索引已经在内存的缓存中就更快了。  大多数情况下, 索引很小,所以就算是 百万级的数据 , 这个过程也相当快。 如果 id 为 整数的并且是顺序的,那么扫描过程还能更快。
  2. 在 for 循环中逐条进行获取操作, 每次只会有一条被数据库加载, 不会对数据库造成很大的内存占用或空间占用,也就不容易使数据库当掉。

再说一下常见的另外一种操作:select * from XXX, 然后逐条处理。

这种方案在数据库执行时,直接全表扫描,可能还会将数据载入缓存,发送给客户端。

当数据量小时, 还不会有问题,数据量大时,因为是加载全部数据,占用内存大不说, 还极有可能导致宕机。

 

第一种写法最为重要的是 findAll 是一定要仅查询 索引列,如果不是, 那估计还不如第二种写法呢。

 

举报
clt
发帖于6年前 1回/1K+阅
顶部