您的位置:首页 > 其它

mybatis使用find_in_set导致cpu占用过高

2013-09-04 15:49 791 查看
问题表asks有个字段attids用来保存问题附件的id,多个附件用“,”隔开,比如有两个附件,附件id分别为8和9,则该字段保存内容为“8,9”

问题maper:

Xml代码



<resultMaptype="com.ozing.dayi.domains.Ask"id="basicAskRsMapper">

......省略其他

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

</resultMap>

附件findAttachListByIds的sql如下:
Sql代码

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

anduo1989
35
004

添加评论


00数据量特别大,attids字段有索引的话建议拼写sql,SELECT * FROM attachs where attids = 8 union ELECT * FROM attachs where attids = 8这种形式2013年5月09日 14:12

zyn010101
2349
13129

添加评论


00SELECT * FROM attachs WHERE FIND_IN_SET(attaid,#{attids}) 因为这是全表扫描 建议改成attaid in (?) 子查询
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: