hibernate + mysql由于sq语句跨表多而导致执行效率低,这样解决好吗?

我在开发web系统,持久层框架是hibernate,数据库是mysql,由于之前没有考虑到sql执行效率的问题,现在不到10万的数据,查询就很慢了,很棘手啊~

查了一些资料,想到了一个办法,比如,在解决子查询的时候,能否把sql拆开,分部执行,先写一个方法,执行完原来子查询的方法,结果集装入List,然后迭代这个List,再去执行原来sql中,子查询外面的主查询,这样,两步执行完,得到目标结果集,我想知道这种方法和原来的子查询哪个执行效率更高,请各位大侠给予指点~

我觉得sql中包含in、or和exists都对系统是很大的累赘,系统的数据量在持续增长,这是个很棘手的问题啊!

另外,还有其他什么好的优化方法,也请大侠们给予指点啊~

f156465465
f156465465 我怎么感觉 优化数据库中的表 才是王道。。。。
7 年多之前 回复

5个回答

楼上的说的不错,看看哪些查询条件可以加索引的,尽量精简查询条件,另外,排序字段是不是有加索引,能否去掉。
mysql一般来说500W数据量之后才会有变慢神马滴。。。

gaobo987567
博高014 排序字段,我已经逐步去掉了,现在不用sql排序,改用取出了List后,再迭代排序,因为我有的排序还需要跨表呢,问经理,他的意见就是尽量少跨表
7 年多之前 回复

10万的数据,查询就很慢 这个很大的原因是查询条件没有加索引
建议记录慢查询 然后挨着解决。

cug_xw
cug_xw 10w条就慢肯定是sql没写好,HQL的精髓在于缓存的使用,如果不用缓存肯定不如自己写的SQL!
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian 这肯定的 所以一般mysql都会记录慢查询 然后分析 再反向找HQL(不好找。。。)
7 年多之前 回复
gaobo987567
博高014 但是优化是要从sql查起
7 年多之前 回复
piggerman
piggerman 才10w数据就慢,肯定是代码效率低下,怪不了hibernate
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian HQL最终会转换为SQL 但是转换规则是死的 不好优化 一般遇到性能问题 都需要单独写SQL解决 这样最灵活 你记录下慢查询 通过explain查看下执行计划 10w条不应该很慢
7 年多之前 回复
gaobo987567
博高014 谢谢哈,不过,索引我加了,另外,再问一下,HQL是不是效率比SQL差很多啊?
7 年多之前 回复

建议你用原始jdbc,绝对比hibernate快,相信我!

bisubisu
山城忙碌人 为什么呢?程序效率不好就可以换嘛!
7 年多之前 回复
gaobo987567
博高014 我也知道,可是系统架构已经这样,而且上线运行了,不可能再换持久层了
7 年多之前 回复

(1) 避免级联,也就是极力避免join,特别是大表的join,使用反范式设计冗余数据;
(2) 所有查询条件相关的字段,都加索引;
(3) 超大的表(1000W以上),使用索引可能都无济于事,需要做水平切分(sharding);
(4) 使用Master-Slave复制,将查询请求导向Slave;
(5) 对于无法优化的查询,使用搜索引擎,避免like等造成全表扫描;

1 数据库做个索引
2 不要用hibernate的查询
3 直接jdbc查询(doWork)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问