- 在使用连接查询的时候最好以数据量小的表为依据,亲测左边表40条数据,右边表72万数据,使用左连接时间保持在2.4到2.7之间,而两张表反过来则保持在3.6到3.8秒,速度差别有点大
- 查询的时候最好带索引,没有索引查的真的很慢。
- 当表的数据量很大并且要多表查询的话,如果有条件筛选,最好先在每个表中先使用条件筛选之后再进行连接,以前亲测,本地三张表一张 2.5万,一张78万,一张1700,三张表一连我在那等的地老天荒,然后先把所有条件放进去差不多十几秒能出来,优化极大,但是这种的话依情况而论,毕竟有时候条件筛选完的数据很少但是也有可能没有干掉多少
- 如果表太大的话最好你需要哪些字段就查哪些字段,有时候明表字段很多但是很多人都是一个*就全部查出来的,真的不要这样,比如我使用了一张72万的表有15个字段,使用*查询速度在1.4~1.5秒,然后我只查询三个字段速度在0.3到0.5秒,这个差别没得说。
- 做好日志,有些没有用的数据该删除就删除,很少用到的就做日志,不要把一张很热的表但是里面又有很多无用数据还存在里面。比如我们公司之前客户的订单表,流水非常的大, 每分钟光插入都是几百看起来不多但是如果积累到一天的话数据量就非常恐怖了,而且这张表读的更是频繁,这个时候真的要求对这张表的读写达到极致,你如果把数据一致存在里面,你自己想想,有时候一天能有几十万单,多几天更是没得说。如果久了,你光是查询这一张表都要很久,别说多表了,当时我们公司就是,因为这个订单因为业务情况每过几分钟就要结算,当结算之后我们会把它存到当日的订单表,每天晚上12点在把该订单表的数据存到订单历史表,因为当时的时候对订单表的读写和当日订单的查询超级的频繁,这样的话效果非常的好。
6.分表操作,很多数据量大的表可以将一个表拆成多个表分散数据量,这样查询的话效率会快很多,比如当时有一个表是记录本省区的一些规则检测问题的,数据量差不多四千多万,那个查询是真的受不了,当时是直接根据城市又拆分出来了多个表,每次根据城市去找相应的表,性能差异很明显。
7.针对某个或某类的查询做个专门的表统计,情况是有个7493374条数据的表,要分页,既然分页肯定要总数,虽然说一般查询数量的很快,但是达到这个量级的时候还是受不了不加条件的时候直接count都要21秒左右(oracle11g),再加两个条件的话真是是难受,当时也是大佬教的,因为这个表基本不怎么会做改动,所以直接给这个表专门做了一个表,将一些对该表的一些查询的条件作为列,再加一列统计该情况下的数据量,分下来之后记录有两万条,查询效率很明显
8.oracle分页优化:
select * from (
select tmp_page.*,rownum row_id from (
查询sql
)tmp_page
where rownum <=#{endRow}
)where row_id &lgt; #{startRow}
听大佬说这是oracle分页最快的而且说官方也有讲,但是也没有验证,后面再去验证一下
9.MyBatis 不要为了多个查询条件而写 1 = 1
当遇到多个查询条件,使用where 1=1 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失,因为添加了 “where 1=1 ”的过滤条件之后,数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描) 以比较此行是否满足过滤条件,当表中的数据量较大时查询速度会非常慢