sql语句优化

mysql--------大数据量分页sql语句优化

岁酱吖の 提交于 2019-12-01 19:28:50
分页程序原理很简单,这里就不多说了,本篇文章主要说的是在数据表记录量比较大的情况下,如何将分页SQL做到更优化,让MySQL执行的更快的方法。 一般的情况下,我们的分页SQL语句是这样的: SELECT * FROM table ORDER BY id LIMIT 1000,10; 以上SQL语句在原理上和在实际操作中是不会存在什么问题,但是当table表的数据量达到几十万以上的时候,上面的语句执行一遍,可能会要执行个十几秒的时间,并且当页数越靠后的话,执行的时间会越长,这个时候我们就需要找到一种更快的查询办法来替代这种操作了。 网上已经有很多优化的方法,基本都是这样的: SELECT * FROM table WHERE id >= (SELECT id FROM table LIMIT 1000000, 1) LIMIT 10; 以上SQL语句是一个不错的解决方法,分页查询的速度基本会保持在1秒之内,但据经验总结得出还有一种更好的办法,如下: SELECT * FROM table WHERE id BETWEEN 1000000 AND 1000010; 相比以上的解决办法,在速度上还会快了不少。 另外分享两个关于查询的技巧: (1)如果需要查询 id 不是连续的一段,最佳的做法就是先找出 id ,然后用 in 查询: SELECT * FROM table WHERE id

SQL语句优化二(ORACLE)

自古美人都是妖i 提交于 2019-11-30 23:55:29
1、IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐方案: 在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。 Exists只检查存在性 ,性能比in强很多,有些朋友不会用Exists,就举个例子 例,想要得到有电话号码的人的基本信息,table2有冗余信息 select * from table1;--(id,name,age) select * from table2;--(id,phone) in: select * from table1 t1 where t1.id in (select t2.id from table2 t2 where t1.id=t2.id); Exists: select * from table1 t1 where Exists (select 1 from table2 t2 where t1.id