我在开发web系统,持久层框架是hibernate,数据库是mysql,由于之前没有考虑到sql执行效率的问题,现在不到10万的数据,查询就很慢了,很棘手啊~
查了一些资料,想到了一个办法,比如,在解决子查询的时候,能否把sql拆开,分部执行,先写一个方法,执行完原来子查询的方法,结果集装入List,然后迭代这个List,再去执行原来sql中,子查询外面的主查询,这样,两步执行完,得到目标结果集,我想知道这种方法和原来的子查询哪个执行效率更高,请各位大侠给予指点~
我觉得sql中包含in、or和exists都对系统是很大的累赘,系统的数据量在持续增长,这是个很棘手的问题啊!
另外,还有其他什么好的优化方法,也请大侠们给予指点啊~
楼上的说的不错,看看哪些查询条件可以加索引的,尽量精简查询条件,另外,排序字段是不是有加索引,能否去掉。
mysql一般来说500W数据量之后才会有变慢神马滴。。。
10万的数据,查询就很慢 这个很大的原因是查询条件没有加索引
建议记录慢查询 然后挨着解决。
建议你用原始jdbc,绝对比hibernate快,相信我!
(1) 避免级联,也就是极力避免join,特别是大表的join,使用反范式设计冗余数据;
(2) 所有查询条件相关的字段,都加索引;
(3) 超大的表(1000W以上),使用索引可能都无济于事,需要做水平切分(sharding);
(4) 使用Master-Slave复制,将查询请求导向Slave;
(5) 对于无法优化的查询,使用搜索引擎,避免like等造成全表扫描;
1 数据库做个索引
2 不要用hibernate的查询
3 直接jdbc查询(doWork)