mybatis使用find_in_set导致cpu占用过高

问题表asks有个字段attids用来保存问题附件的id,多个附件用“,”隔开,比如有两个附件,附件id分别为8和9,则该字段保存内容为“8,9”

问题maper:

Xml代码 收藏代码
  1. <resultMaptype="com.ozing.dayi.domains.Ask"id="basicAskRsMapper">

  2.            ......省略其他    

  3. <associationproperty="attachList"column="attids"select="com.ozing.dayi.persistence.AttachMapper.findAttachListByIds"/  

  4. </resultMap>




附件findAttachListByIds的sql如下:
Sql代码 收藏代码
  1. SELECT * FROM attachs WHERE FIND_IN_SET(attaid,#{attids})  



用Show Processlist查看,发现经常有上面那句sql,而且mysql经常讲cpu的使用率占到100以上,该加的索引都加了。





解决方案:

分析下原因:ASK与attach的关系是1对多的关联,如楼主那样的配置出来的结构肯定是需要关联查询的。如何解决这样的关联查询呢? 在mapper.xml中不配置这样的关联关系,用程序来控制关联关系。这样就避免了数据库查询时关联查询导致的高IO读取问题,也就降低了CUP的占用。

2013年5月09日 20:53
  • Comment添加评论

0 0

数据量特别大,attids字段有索引的话建议拼写sql,SELECT * FROM attachs where attids = 8 union ELECT * FROM attachs where attids = 8这种形式

2013年5月09日 14:12
  • Comment添加评论

0 0

SELECT * FROM attachs WHERE FIND_IN_SET(attaid,#{attids})   因为这是全表扫描 建议改成attaid in (?) 子查询


你可能感兴趣的:(mybatis)