关于多表查询时,如何可以提高查询速度?

smh821025 发布于 2013/04/18 19:05
阅读 3K+
收藏 2

请教下各位,

公司系统采用hibernate实现持久层操作,数据库是mysql。

现在出现一个典型的性能问题,由于需求要求有很多属性,因此一个实体DTO里面会封装多个DTO(这个是成型的,不能修改),总共加起来大概有将近十张表,而且是用hql查出来,字段非常多,而且一个都不能少,里面的属性都需要。现在在进行hibernate查询的时候,会卡住很长时间,将近40多秒,数据量不大。目前只查出两条数据,重点在多表和多字段上面。请问有没有可以解决的办法,加索引或代码实现优化,什么方法速度可以相对于快一些,谢谢高手指点。

PS:查询的方式就是多表联合查询,普通的关联查询,一个表与其他多个表的主外键一一对应的查询方法。

加载中
0
RegnoiX
RegnoiX

1.看看日志,执行的sql有没有优化的空间

2.使用缓存

0
xmut
xmut

1.关联表时哪些表排在前面,哪些查询字段放在前面(一般满足条件多的放在前面……),都是有讲究的!

2.使用MySQL的Explain命令分析SQL语句瓶颈

3.写视图,减少编译时间

4.上面写的好像都跟Hibernate没关系,而且也无法干预HQL,不过可以用调优后的SQL代替。

xmut
xmut
回复 @苏翰 : 比如,把能过滤更多数据的条件放在前面,过滤少的条件放后面
苏生不惑
苏生不惑
关联表时哪些表排在前面,哪些查询字段放在前面(一般满足条件多的放在前面……),都是有讲究的! 怎么讲究的?和顺序也有关系吗
smh821025
smh821025
没有任何的查询条件,说过了,就是基本的多表联查
0
平安北京
这个真没有好的办法,还是从sql上动手,先过滤一部分数据
smh821025
smh821025
回复 @冷泉 : 不是对大数据量的拆分,是对单个表的字段拆分,好像mysql的字段越多速度越慢,可不可以把多个字段的表拆分成多个字段少的表,这样做有意义吗
平安北京
回复 @smh821025 : 数据量大视图解决不了根本性的问题,拆表是可以的,我在项目中经常拆表,一批数据有1亿多条,分拆成200张表,甚至在不同的数据上,专门有个表存索引,要查询的时候先找到表名,然后再去查目标表
smh821025
smh821025
用视图可以实现快一些么,如果是表拆分可以么
0
八宝旗
八宝旗

好久没用hibernate了,记得可以把show_sql参数设为true,hql转换后的sql会被输出到控制台,接着用explain分析下sql的执行计划,还可以再结合profile看下具体哪个阶段比较耗时。

最好能贴下sql的explain结果,这样才可以针对性的优化

0
kenyon_君羊
kenyon_君羊
多表查询是Mysql的一个劣势。
smh821025
smh821025
回复 @mark35 : 对explain这个工具我确实没有用过,不过这个东西应该和oracle的语句分析工具都是差不多的,普通的多表联合查询难道也可以分析出一些特别之处么,到公司试一下吧,谢谢。 我们的hibernate实现之所以是速度慢,是因为多个表,每个表都需要去查一遍造成的,如果分析出效率高的sql比hql快的话,就可以用sql完全代替了吧
mark35
mark35
回复 @smh821025 : 你先用explain看看sql执行情况如何,一般来说升级磁盘系统对mysql性能会有极大提升
smh821025
smh821025
回复 @mark35 : 40m当然不行,我只是想把查询时间缩短到最多5-10m之间,难道还要动硬件么
mark35
mark35
回复 @smh821025 : 和查询无关,只与需求有关:如果你的需求可以接受一个查询耗费40秒那用mysql就没问题,如果能接受一个查询耗费一天,那手工翻账本都没问题
smh821025
smh821025
回复 @mark35 : 只是一个查询,没必要吧
下一页
0
宏哥
宏哥
回复 @kenyon(君羊) :  确信今年能实现 物化视图?
放倒
放倒
@宏哥 https://commitfest.postgresql.org/action/patch_view?id=994 三月份还在讨论命名和语法,年底能上测试版就不错了。
kenyon_君羊
kenyon_君羊
回复 @宏哥 : 上次看到好像是全量更新,不知道到时候出来的版本支不支持增量更新。不过也不错了。
宏哥
宏哥
回复 @kenyon(君羊) : 这真是令人兴奋的消息. 不管多大的代价, 上materialized view的生产版本, 我就直接上了.
kenyon_君羊
kenyon_君羊
开发版本已经出来了,可以去下载来用用
0
mark35
mark35
多表查询?呵呵,mysql直接歇菜吧
0
开源中国董事会主席
开源中国董事会主席

引用来自“宏哥”的答案

回复 @kenyon(君羊) :  确信今年能实现 物化视图?

原来宏哥也用 mysql 啊?

第一次见 宏哥没有 喷 mysql 啊

0
布谷鸟
布谷鸟
不怎么会sql,反正我在做需要联合查询的地方全都换成了逐一查询后再填充进map,在过程中我可以适当的缓存某些数据以便下次查询的时候不在经过数据库。
smh821025
smh821025
逐一对每个表进行查询,和联合多表查询有什么区别么,速度还不是差不多,缓存本身hibernate就解决了,你说的这些处理机制属于太常见的了吧
0
kenyon_君羊
kenyon_君羊

引用来自“腾勇”的答案

引用来自“宏哥”的答案

回复 @kenyon(君羊) :  确信今年能实现 物化视图?

原来宏哥也用 mysql 啊?

第一次见 宏哥没有 喷 mysql 啊

宏哥说的是postgres
返回顶部
顶部